C++算法题_02

  • 输入二进制输出十进制
/*
问题描述
  编写一个程序,输入一个二进制的字符串(长度不超过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;
}
发布了21 篇原创文章 · 获赞 14 · 访问量 4104

猜你喜欢

转载自blog.csdn.net/Cxk___/article/details/103270042