/*
问题描述
编写一个程序,输入一个二进制的字符串(长度不超过32),然后计算出相应的十进制整数,并把它打印出来。
输入格式:输入为一个字符串,每个字符都是’0’或’1’,字符串的长度不超过32。
输出格式:输出一个整数。
输入输出样例
样例输入
1101
样例输出
13
*/
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
int main() {
string str;
int sum = 0;
cin >> str;
for (int i = str.length(),j=0;i>=0;i--,j++) {
if (str[i]== '1')
sum += pow(2, j);
if(str[i]=='0')
sum+=0;
}
cout << sum/2;
return 0;
}
#include<iostream>
#include<string.h>
using namespace std;
long fun(string s) ;
int main(){
string hex;
cin>>hex;
int sum=0;
sum=fun(hex);
cout<<sum;
/*for(int i = 1;i<hex.length();i++){
cout<<i<<" ";
sum=sum+hex[i]*pow(16,i);
cout<<sum;
}
}*/
}
long fun(string s)
{
int i,t;
long sum=0;
for(i=0;i<s.length();i++)
{
if(s[i]<='9')
t=s[i]-'0';
else
t=s[i]-'a'+10;
sum=sum*16+t;
}
return sum;
}
// a 65
/*方法二:
#include<iostream>
#include<string.h>
using namespace std;
long sum = 0;
long Hexadecimal(string s) {
int i, a;
for (i = 0; i < s.length(); i++) {
if (s[i] <= '9')
a = s[i] - '0';
else
a = s[i] - 'A' + 10;
sum = sum * 16 + a;
}
return sum;
}
int main() {
string hex;
cin >> hex;
sum = Hexadecimal(hex);
cout << sum;
} */
#include<iostream>
using namespace std;
int main()
{
long long n;
cin >> n;
char hex[10] = { '0' };
int i, j = 0;
if (n == 0)
{
cout << hex[0];
}
else
{
for (i = 0; n; i++)
{
j = n % 16;
if (j <= 9)
hex[i] = j + '0';
else
hex[i] = j - 10 + 'A';
n = n / 16;
}
for (j = i - 1; j >= 0; j--)
cout << hex[j];
}
}
#include<iostream>
using namespace std;
int multiply( int x, int y)
{
int ans=0;
while (x > 0)
{
if (x & 1)
{
ans += y;
}
y <<= 1;/*y = y << 1 左移运算符(<<)
左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。*/
x >>= 1;
}
return ans;
}
int main()
{
int n,m;
cin>>n>>m;
cout<<multiply(n,m)<<endl;
return 0;
}
/*
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数。
该题比较简单,解法有挺多,有位移法、位操作法、查表法、二次查表法等方法。
观察一下 n 与 n-1 这两个数的二进制表示:对于 n-1 这个数的二进制来说,相对于 n 的二进制,它的最末位的一个 1 会变成 0,最末位一个 1 之后的 0 会全部变成 1,其它位相同不变。
比如 n = 8888,其二进制为 10001010111000
则 n - 1 = 8887 ,其二进制为 10001010110111
通过按位与操作后:n & (n-1) = 10001010110000
也就是说:通过 n&(n-1)这个操作,可以起到消除最后一个1的作用。
所以可以通过执行 n&(n-1) 操作来消除 n 末尾的 1 ,消除了多少次,就说明有多少个 1 。*/
#include<iostream>
using namespace std;
//位1的个数
int hammingWeight(int n) {
int res = 0;
for (int i = 0; i < 32; ++i) {
res += (n & 1);
n = n >> 1;
}
return res;
}
/*
,如果一个数是 2 的次方数的话,那么它的二进数必然是最高位为1,其它都为 0 ,那么如果此时我们减 1 的话,则最高位会降一位,其余为 0 的位现在都为变为 1,那么我们把两数相与,就会得到 0。
比如 2 的 3 次方为 8,二进制位 1000 ,那么 8 - 1 = 7,其中 7 的二进制位 0111。*/
//2的幂
bool isPowerOfTwo(int n) {
return (n > 0) && (!(n & (n - 1)));
}
//同出1不同出0
int main()
{
int m;
cin>>m;
cout<<hammingWeight(m)<<endl;
cout<<isPowerOfTwo(m)<<endl;
return 0;
}
#include<iostream>
using namespace std;
typedef int CXK;
int main()
{
/*
~ 按位取反
& 按位取与
| 按位取或
^ 按位异或
*/
CXK a=10,b=12;
cout<<"a = "<<a<<" b o= "<<b<<endl;
CXK flag=~a;
cout<<"~a = "<<flag<<endl;
flag=a&b;
cout<<"a&b = "<<flag<<endl;
flag=a|b;
cout<<"a|b = "<<flag<<endl;
flag=a^b;
cout<<"a^b = "<<flag<<endl;
return 0;
}
#include<iostream>
#include<time.h>
using namespace std;
double fib(int n)
{
if (n == 0)
return 0;
if (n == 1)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
int main()
{
double sum = 0, sums = 0;
time_t timep;
struct tm *p;
time(&timep);
p = gmtime(&timep);
cout << "采用三变量求斐波那契数列和程序开始运行时间为:" << endl;
printf("%d\\%d\\%d ", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday);
printf("%d:%d:%d\n\n", p->tm_hour + 8, p->tm_min, p->tm_sec);
clock_t start = clock();
double fenzi = 2, fenmu = 1, temp = 0;
for (int i = 0; i < 20; i++)
{
cout << fenzi << "/" << fenmu << endl;
sum += fenzi / fenmu;
temp = fenmu;
fenmu = fenzi;
fenzi += temp;
}
cout << endl<<sum << endl << endl;
clock_t ends = clock();
cout << "程序运行所需要时间 : " << (double)(ends -start) /CLOCKS_PER_SEC << " 秒\n" << endl;
cout << "递归求斐波那契数列分数和程序开始运行时间为:" << endl;
printf("%d\\%d\\%d ", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday);
printf("%d:%d:%d\n\n", p->tm_hour + 8, p->tm_min, p->tm_sec);
clock_t start2 = clock();
for (int i = 3; i < 23; i++)
{
cout << fib(i) << "/" << fib(i - 1) << endl;
sums += fib(i) / fib(i - 1);
}
cout << endl<<sums << endl << endl;
clock_t ends2 = clock();
cout << "程序运行所需要时间 : " << (double)(ends2 -start2) /CLOCKS_PER_SEC << " 秒\n" << endl;
return 0;
}
#include<math.h>
#include<iostream>
using namespace std;
void prime(int j) {
cout << j << "=";
for (int i = 2; i <= sqrt(j); i++) {
if (j % i == 0) {
j /= i;
cout << i-- << "*";
}
}
cout << j << endl;
}
int main() {
/*int n, m, i;
cin >> n >> m;
for (i = n; i <= m; i++) {
prime(i);
}*/
prime(7775460);
return 0;
}
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
int fineInteger(char *p, int *a)
{
int i, j, k, n = 0;
char temp[100];
for (i = 0; p[i] != '\0'; i++)
{
j = 0;
while (p[i] >= '0' && p[i] <= '9')
{
temp[j] = p[i];
j++;
i++;
}
if (j != 0)
{
*a = atoi(temp);
a++;
n++;
for (k = 0; k < j; k++)
temp[k] = 0;
i--;
}
}
return n;
}
int main()
{
int i, m, a[100];
char line[100];
cout << "请输入一个字符串" << endl;
cin >> line;
m = fineInteger(line, a);
cout << "字符串中共有:" << m << "个整数" << endl;
for (i = 0; i < m; i++)
{
cout << setw(8) << a[i];
}
cout << endl;
return 0;
}
/*
Torry从小喜爱数学。一天,老师告诉他,像2、3、5、7……这样的数叫做质数。Torry突然想到一个问题,前10、100、1000、10000……个质数的乘积是多少呢?他把这个问题告诉老师。老师愣住了,一时回答不出来。于是Torry求助于会编程的你,请你算出前n个质数的乘积。不过,考虑到你才接触编程不久,Torry只要你算出这个数模上50000的值。
输入格式
仅包含一个正整数n,其中n<=100000。
输出格式
输出一行,即前n个质数的乘积模50000的值。*/
#include<iostream>
#include<math.h>
using namespace std;
bool zs(int n)
{
if(n==0||n==1)
return 0;
else if(n==2)
return 1;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
int n;
int i=1;
int num=1;
cin>>n;
int k=0;
while(k<n)
{
if(zs(i))
{
k++;
num*=i;
}
i++;
}
num=num%50000;
cout<<num;
return 0;
}
/*
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 */
#include<iostream>
using namespace std;
int main()
{
int c[5] = { 1, 2, 1, 3, 3 };
int sum = 0;
for (int i = 0; i < 5; i++)
sum ^= c[i];
cout <<"只出现了一次的元素:"<< sum<<endl;
/*另类元素互换*/
int a = 2, b = 3;
cout << "未进行转换的a=" << a << ",b=" << b << endl;
a = a ^ b;
b = a ^ b;
a = a ^ b;
cout << "进行了转换的a=" << a << ",b=" << b << endl;
return 0;
}