36道C++算法题

            目录

      • 1 1 1.读取0-1000之间的整数,求整数各位数的和
      • 2 2 2.金融应用:复利值
      • 3 3 3.随机月份
      • 4 4 4.商业:检验ISBN-10 ISBN-10(国际标准书号)
      • 5 5 5.计算三角形周长
      • 6 6 6.点是否在圆内
      • 7 7 7.游戏(抽牌)
      • 8 8 8.几何:两个圆
      • 9 9 9.计算三角形的角度
      • 10 10 10.最大圆距离 (球面上的两个点之间距离)
      • 11 11 11.计算将来的学费
      • 12 12 12.显示金字塔
      • 13 13 13.打印金字塔形的数字
      • 14 14 14.计算 π π π
      • 15 15 15.计算 e e e
      • 16 16 16.显示闰年
      • 17 17 17.显示每月第一天是星期几
      • 18 18 18.显示日历
      • 19 19 19.游戏:彩票
      • 20 20 20.完全数
      • 21 21 21.剪刀石头布
      • 22 22 22.十进制转换二进制
      • 23 23 23.十进制转八进制
      • 24 24 24.改写22和23题,让用户选择计算1~16进制
      • 25 25 25.计算平均值和标准方差
      • 26 26 26.将毫秒数转换成 小时:分钟:秒
      • 27 27 27.回文素数
      • 28 28 28.反素数
      • 29 29 29.梅森素数
      • 30 30 30.双素数
      • 31 31 31.双骰子赌博
      • 32 32 32.金融应用:信用卡号的合法性验证

1 1 1.读取0-1000之间的整数,求整数各位数的和

#include
#include
using namespace std;
void main()
{
	int n;
	int res=0;
	cout<<"请输入1-1000的整数";
	cin>>n;
	while(n)
	{
		res+=n%10;
		n/=10;
	}
	cout<<res;
}

2 2 2.金融应用:复利值

假设你每月向银行账户存100美元,年利率为5%,那么每月利率是0.05/12=0.00417第一个月之后:账户上的值变成了100*(1+0.00417)=100.417第二个月之后:账户上的值变成了(100+100.417)*(1+0.00417)=201.252第三个月之后:账户上的值变成了(100+201.252)*(1+0.00417)=302.507以此类推,编写显示n个月后的账户上的钱数

#include
using namespace std;
void main()
{
	int n;
	cout<<"请输入n:";
	cin>>n;
	double p=0;
	while(n)
	{
		p=(100.0+p)*(1.0+0.05/12);
		n--;
	}
	cout<<p;
}

3 3 3.随机月份

编写一个随机产生1和12之间的整数的程序,并且根据数字显示相应的月份单词

#include
#include
#include 
using namespace std;
void main()
{
	srand((unsigned)time(0));
	char *month[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
	cout<<month[rand()%12]<<endl;
}

4 4 4.商业:检验ISBN-10 ISBN-10(国际标准书号)

检验ISBN-10 ISBN-10(国际标准书号)由十个个位整数d1 d2 d3 d4 d5 d6 d7 d8 d9 d10组成,最后一位d10是校验和,它是使用下面公式用另外9位数字计算出来的
(d11+d22+d33+d44+d55+d66+d77+d88+d9*9)%11,如果最后一位是10,那么按照ISBN-10的习惯,最后一位应该表示为X
提示用户输入前9个数,然后显示10位ISBN

#include
#include
using namespace std;
void main()
{
	cout<<"请输入ISBN-10前九位数:";
	string isbn;
	do
	{
		cin>>isbn;
	}
	while(isbn.length()!=9);
	int p=0;
	for(int i=0;i<9;i++)
	{
		p+=(isbn[i]-48)*(i+1);
	}
	isbn+=(p%11==10?'X':p%11+48);
	cout<<isbn;
}

5 5 5.计算三角形周长

#include
using namespace std;
void main()
{
	double a=0,b=0,c=0;
	cout<<"请输入三角形的三边长度:";
	do
	{
		if(a!=0)
		{
			cout<<"你输入的三角形不合法";
		}
		cin>>a>>b>>c;
	}
	while(a+b<=c||a+c<=b||b+c<=a);
	cout<<"三角形周长:"<<a+b+c;
}

6 6 6.点是否在圆内

#include
#include
using namespace std;
void main()
{
	double x,y,c_x,c_y,r;
	cout<<"请输入一个点:";
	cin>>x>>y;
	cout<<"请输入一个圆心和半径";
	cin>>c_x>>c_y>>r;
	if(sqrt(pow(c_x-x,2)+pow(c_y-y,2))>r)
	{
		cout<<"点("<<x<<","<<y<<")不在圆内";
	}
	else
	{
		cout<<"点("<<x<<","<<y<<")在圆内";
	}
}

7 7 7.游戏(抽牌)

模拟从一副52张的牌中抽一张牌,并显示牌的大小和花色

#include
#include
using namespace std;
void main()
{
	srand((unsigned)time(0));
	char *n[]={"1","2","3","4","5","6","7","8","9","10","J","Q","k"};
	char *color[]={"梅花","方块","红心","黑桃"};
	int p=rand()%52;
	cout<<"抽到 ["<<color[p/13]<<n[p/4]<<"]"<<endl;
}

8 8 8.几何:两个圆

判断第二个圆是否在第一个圆内,还是和第一个圆重叠

#include
#include
using namespace std;
void main()
{
	double f_x,f_y,f_r,s_x,s_y,s_r;
	cout<<"请输入第一个圆的圆心和半径";
	cin>>f_x>>f_y>>f_r;
	cout<<"请输入第二个圆的圆心和半径";
	cin>>s_x>>s_y>>s_r;
	if(fabs(f_r-s_r)>=sqrt(pow(f_x-s_x,2)+pow(f_y-s_y,2)))//比较两圆的半径差和两圆心之间距离
	{
		if(f_r>s_r)
		{
			cout<<"第二个圆在第一个圆内";
		}
		else
		{
			cout<<"第一个圆在第二个圆内";
		}
	}
	else if(f_r+s_r>=sqrt(pow(f_x-s_x,2)+pow(f_y-s_y,2)))
	{
		cout<<"两个圆重叠";
	}
	else
	{
		cout<<"两个圆不重叠";
	}
}

9 9 9.计算三角形的角度

数学公式:A=acos((a\*a-b\*b-c\*c)/(-2\*b\*c))
                 B=acos((b\*b-a\*a-c\*c)/(-2\*a\*c))
                 C=acos((c\*c-b\*b-a\*a)/(-2\*b\*a))
acos反余弦公式求出来的值是弧度制的,所以还要除3.14再乘180

#include
#include
using namespace std;
void main()
{
	double a_x,a_y,b_x,b_y,c_x,c_y;
	double ab,bc,ca;
	cout<<"请输入三角形的三点坐标:";
	cin>>a_x>>a_y>>b_x>>b_y>>c_x>>c_y;
	bc=sqrt(pow(b_x-c_x,2)+pow(b_y-c_y,2));
	ca=sqrt(pow(c_x-a_x,2)+pow(c_y-a_y,2));
	ab=sqrt(pow(a_x-b_x,2)+pow(a_y-b_y,2));
	cout<<"三角形:A="<<acos((bc*bc-ca*ca-ab*ab)/(-2*ca*ab))/3.14*180;
	cout<<"°\nB="<<acos((ca*ca-bc*bc-ab*ab)/(-2*bc*ab))/3.14*180<<
	cout<<"°\nC="<<acos((ab*ab-ca*ca-bc*bc)/(-2*ca*bc))/3.14*180<<"°"<<endl;
}

10 10 10.最大圆距离 (球面上的两个点之间距离)

假设 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2)是两点的地理经纬度两个点的经纬度可用以下公式算
d=半径*arccos(sin(x1)*sin(x2)+cos(x1)*cos(x2)*cos(y1-y2))
地球半径为 6371.01 k m 6371.01km 6371.01km

#include
#include
using namespace std;
double toRadian(double a)//把角度转成弧度制
{
	double pi=3.1415926;
	return a/180*pi;
}
void main()
{
	double f_x,f_y,s_x,s_y;
	cout<<"请输入两点的经纬度:";
	cin>>f_x>>f_y>>s_x>>s_y;
	cout<<"两点距离为:"<<6371.01*acos(sin(toRadian(f_x))*sin(toRadian(s_x))+cos(toRadian(f_x))*cos(toRadian(s_x))*cos(toRadian(f_y-s_y)))<<"km";
}

11 11 11.计算将来的学费

假设今年某大学的学费为10000美元,学费的年增长率为5%,一年后,学费将是10500美元。计算10年后的学费,以及从现在开始的10年后算起,4年内的总学费

#include
using namespace std;
void main()
{
	double now=10000;//储存当前学费
	double sum=0;//计算10年后的4年内的总学费
	int year=1;//几年后
	while(year<=13)
	{
		now+=now*0.05;
		if(year==10)
		{
			cout<<"十年后的学费:"<<now<<endl;
		}
		if(year>=10)
		{
		
			sum+=now;
		}
		year++;
	}
	cout<<"10年后算起,4年内的总学费是:"<<sum<<endl;
}

12 12 12.显示金字塔

提示用户输入一个在1到15之间的整数,然后显示一个金字塔的形状
示例:
                1
            2  1  2
        3  2  1  2  3
    4  3  2  1  2  3  4
5  4  3  2  1  2  3  4  5

#include
using namespace std;
void main()
{
	int n;
	cout<<"请输入1到15之间的整数"<<endl;
	cin>>n;
	for(int i=1;i<=n;i++)//循环打印n行
	{
		for(int j=0;j<(n-i)*3;j++)
			cout<<" ";//经过我的观察,每一行前有(n-i)*3个空格,其中n是总行数,i是当前行数
		int t=i;
		while(t!=0)
		{
			t<10?cout<<t<<"  ":cout<<t<<" ";//输出当前行i到1递减的数字,并且,每输出一次数字后判断这个数字是否是两位数,如果是就输出这个数字后只输出一个空格,不是就输出两个空格
			t--;
		}
		t=2;
		while(t<=i)
		{
			t+1<10?cout<<t<<"  ":cout<<t<<" ";//输出当前行2到i递增的数字,并且,每输出一次数字后判断下一个数字是否是两位数,如果是就输出这个数字后只输出一个空格,不是就输出两个空格
			t++;
		}
		cout<<endl;
	}
}

13 13 13.打印金字塔形的数字

#include
#include
using namespace std;
void main()
{
	int n;
	int kg;//数字之间最大空格数
	cout<<"请输入1到9之间的整数"<<endl;
	cin>>n;
	for(int i=1;i<=n;i++)//循环打印n行
	{
		for(int j=0;j<(n-i)*4;j++)
			cout<<" ";
		int t=1;
		while(t<=pow(2,i-1))
		{
			if(t*2<=pow(2,i-1))
			{
				t*2<10?cout<<t<<"   ":t*2<100?cout<<t<<"  ":cout<<t<<" ";
			}
			else
			{
				t/2<10?cout<<t<<"   ":t/2<100?cout<<t<<"  ":cout<<t<<" ";
			}
			t*=2;
		}
		t=pow(2,i-2);
		while(t>=1)
		{
			t/2<10?cout<<t<<"   ":t/2<100?cout<<t<<"  ":cout<<t<<" ";
			t/=2;
		}
		cout<<endl;
	}
}

14 14 14.计算 π π π

使用公式 π π π=4(1- 1 3 \frac{1}{3} 31+ 1 5 \frac{1}{5} 51- 1 7 \frac{1}{7} 71+ 1 9 \frac{1}{9} 91- 1 11 \frac{1}{11} 111+ ⋯ \cdots + − 1 i + 1 2 i − 1 \frac{-1^{i+1}}{2i-1} 2i11i+1)

#include
#include 
using namespace std;
void main()
{
	double p=0;
	double t=1;
	for(double i=1;i<=100000;i++)
	{
		p+=t/(2*i-1);
		t*=-1;
		if((int)i%10000==0)
		{
			cout<<"当i="<< fixed << setprecision(0)<<i<<"时,π="<< fixed << setprecision(8)<<4*p<<endl;
		}
	}
}

15 15 15.计算 e e e

使用公式 e e e=1+ 1 1 ! \frac{1}{1!} 1!1+ 1 2 ! \frac{1}{2!} 2!1+ 1 3 ! \frac{1}{3!} 3!1+ 1 4 ! \frac{1}{4!} 4!1+ ⋯ \cdots + 1 i ! \frac{1}{i!} i!1

#include
#include 
using namespace std;
void main()
{
	double now=1;
	double res=1;
	for(double i=1;i<=100000;i++)
	{
		now*=1/i;
		res+=now;
		if((int)i%10000==0)
		{
			cout<<"当i="<< fixed << setprecision(0)<<i<<"时,e="<< fixed << setprecision(8)<<res<<endl;
		}
	}
}

16 16 16.显示闰年

显示从101到2100期间所有的闰年,每行显示10个,数字之间用空格隔开,同时显示这期间闰年的数目

#include
using namespace std;
bool judge(int y)//定义一个函数来判断这个年是否为闰年
{
	if(y%4==0&&y%100!=0||y%400==0)
	{
		return true;
	}
	else
	{
		return false;
	}
}
void main()
{
	int num=0;//计数闰年的个数
	for(int i=101;i<=2100;i++)
	{
		if(judge(i))
		{
			cout<<i<<" ";
			num++;
			if(num%10==0) cout<<endl;
		}
	}
	cout<<"该期间闰年总数为:"<<num<<endl;
}

17 17 17.显示每月第一天是星期几

提示用户输入年份及该年第一天是星期几的数字,然后在控制台上显示该年每月第一天是星期几

#include
using namespace std;
void main()
{
	int y,n;
	int a[12]={3,0,3,2,3,2,3,3,2,3,2,3};
	int b[12]={3,1,3,2,3,2,3,3,2,3,2,3};
	char *w[]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
	cout<<"请输入年份及改年第一天是星期几的数字:";
	cin>>y>>n;
	if(y%4==0&&y%100!=0||y%400==0)
	{
		int p=n;
		for(int i=1;i<=12;i++)
		{
			cout<<y<<"年"<<i<<"月1日:"<<w[(p-1)%7]<<endl;
			p+=b[i-1];
		}
	}
	else
	{
		int p=n;
		for(int i=1;i<=12;i++)
		{
			cout<<y<<"年"<<i<<"月1日:"<<w[(p-1)%7]<<endl;
			p+=a[i-1];
		}
	}
}

18 18 18.显示日历

提示用户输入年份及改年第一天是星期几的数字,然后在控制台上显示该年日历表

#include
using namespace std;
void main()
{
	int y,n;
	int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};
	cout<<"请输入年份及改年第一天是星期几的数字:";
	cin>>y>>n;
	for(int i=1;i<=12;i++)
	{
		cout<<"\n"<<i<<"月"<<endl;
		cout<<"Sun\tMon\tTue\tWed\tThu\tFri\tSat"<<endl;
		for(int j=-(n%7)+1;j<=(y%4==0&&y%100!=0||y%400==0?b[i-1]:a[i-1]);j++)//(y%4==0&&y%100!=0||y%400==0?b[i-1]:a[i-1])三目运算符,有时候可以代替if语句
		{
			if(j>0) cout<<j<<"\t";
			else cout<<"\t";
			if((j+n)%7==0&&j>0) cout<<endl;
		}
		n=((y%4==0&&y%100!=0||y%400==0?b[i-1]:a[i-1])%7+n)%7;
	}
}

19 19 19.游戏:彩票

产生两位数彩票,产生第一个数后,使用循环不断产生第二个数,直与第一个数不同为止

#include
#include
using namespace std;
void main()
{
	int a,b;
	srand((unsigned)time(0));
	a=rand()%9;
	do{
		b=rand()%9;
	}
	while(a==b);
	cout<<"彩票:"<<a<<b<<endl;
}

20 20 20.完全数

如果一个正整数等于除它本身之外其他所有除数之和,就称之为完全数,10000以下有四个完全数,找出这四个完全数

#include
#include
using namespace std;
void main()
{
	for(int i=2;i<10000;i++)
	{
		int res=1;
		int j=2;
		while(j<=sqrt(i))
		{
			if(i%j==0) 
			{
				if(j!=i/j) res+=j+i/j;
				else res+=j;
			}
			j++;
		}
		if(res==i) cout<<res<<endl;
	}
}

21 21 21.剪刀石头布

可以连续玩这个游戏直到用户或计算机赢对手两次以上为止

#include
#include
using namespace std;
void main()
{
	srand((unsigned)time(0));
	int u=0;//玩家赢次数
	int c=0;//电脑赢次数
	while(u<3&&c<3)
	{
		int p,t;
		char *s[]={"剪刀","石头","布"};
		cout<<"请出手:";
		cin>>p;//1代表剪刀 2代表石头 3代表布
		t=rand()%3+1;
		cout<<"你出了"<<s[p-1]<<"电脑出了"<<s[t-1];
		if(p==((t+1)%3==0?3:(t+1)%3))
		{
			u++;
			cout<<" 本局你赢"<<endl;
		}
		else if(p!=t)
		{
			c++;
			cout<<" 本局电脑赢"<<endl;
		}
		else
		{
			cout<<" 平局"<<endl;
		}
	}
	cout<<"电脑赢了"<<c<<"局"<<endl;
	cout<<"玩家赢了"<<u<<"局"<<endl;
	c>u?cout<<"电脑获胜":cout<<"玩家获胜";
}

22 22 22.十进制转换二进制

#include
#include
using namespace std;
void main()
{
	vector<int> a;
	int i;
	cout<<"请输入十进制数:"<<endl;
	cin>>i;
	while(i)
	{
		a.push_back(i%2);
		i/=2;
	}
	cout<<"二进制数为";
	for(i=a.size()-1;i>=0;i--)
	{
		cout<<a[i];
	}
	cout<<endl;
}

23 23 23.十进制转八进制

#include
#include
using namespace std;
void main()
{
	vector<int> a;
	int i;
	cout<<"请输入十进制数:"<<endl;
	cin>>i;
	while(i)
	{
		a.push_back(i%8);
		i/=8;
	}
	cout<<"八进制数为";
	for(i=a.size()-1;i>=0;i--)
	{
		cout<<a[i];
	}
	cout<<endl;
}

24 24 24.改写22和23题,让用户选择计算1~16进制

#include
#include
using namespace std;
void main()
{
	vector<char> a;
	char z[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	int i,t;
	cout<<"请输入十进制数:"<<endl;
	cin>>i;
	cout<<"请输入要转化的进制数:"<<endl;
	cin>>t;
	while(i)
	{
		a.push_back(z[i%t]);
		i/=t;
	}
	cout<<t<<"进制数为";
	for(i=a.size()-1;i>=0;i--)
	{
		cout<<a[i];
	}
	cout<<endl;
}

25 25 25.计算平均值和标准方差

#include
#include
using namespace std;
void main()
{
	cout<<"请输入10个数字:"<<endl;
	double a[10];
	double p=0,t=0;
	for(int i=0;i<10;i++)
	{
		cin>>a[i];
		p+=a[i];
		t+=pow(a[i],2);
	}
	cout<<"平均值:"<<p/10<<"标准方差:"<<sqrt((t-pow(p,2)/10)/9);
}

26 26 26.将毫秒数转换成 小时:分钟:秒

#include
using namespace std;
void main()
{
	int p;
	cout<<"请输入毫秒数"<<endl;
	cin>>p;
	p/=1000;
	cout<<"\n"<<p/3600<<":"<<p%3600/60<<":"<<p%60<<endl;
}

27 27 27.回文素数

回文素数,指的是一个数即是回文数也是素数
在控制台显示前一百个回文素数,每10个换一次行

#include
#include
#include
#include
using namespace std;
bool judge(int n)///判断回文素数
{
	if(n%2==0&&n!=2) return false;//除了2本身,能整除2的一定不是素数
	for(int i=3;i<=sqrt(n);i++) 
		if(n%i==0) return false;
	stringstream ss;
	string str;
	ss<<n;
	ss>>str;
	for(int j=0;j<str.length()/2;j++)
		if(str[j]!=str[str.length()-j-1]) return false;
	return true;
}
void main()
{
	int n=0;
	for(int i=2;n<100;i++)
	{
		if(judge(i))
		{
			cout<<i<<" ";
			n++;
			if(n%10==0) cout<<endl;
		}
	}
}

28 28 28.反素数

反素数,指的是一个非回文素数,反转了之后还是素数
在控制台显示前一百个反素数,每10个换一次行

#include
#include
using namespace std;
int reverse(int n)//反转数字
{
	int res=0;
	while(n)
	{
		res*=10;
		res+=n%10;
		n/=10;
	}
	return res;
}
bool judge(int n)///判断素数
{
	if(n%2==0&&n!=2) return false;
	for(int i=3;i<=sqrt(n);i++)
		if(n%i==0) return false;
	return true;
}
void main()
{
	int n=0;
	for(int i=2;n<100;i++)
	{
		int p=reverse(i);
		if(judge(i)&&judge(p)&&i!=p)
		{
			cout<<i<<" ";
			n++;
			if(n%10==0) cout<<endl;
		}
	}
}

29 29 29.梅森素数

梅森素数,指的是一个素数可以表示成 2 p − 1 2^{p}-1 2p1的形式,其中p是正整数
找出 p ≤ 31 p\leq31 p31的所有梅森素数

#include
#include
using namespace std;
bool judge(int n)///判断素数
{
	if(n%2==0&&n!=2)
	{
		return false;
	}
	for(int i=3;i<=sqrt(n);i++)
	{
		if(n%i==0)
		{
			return false;
		}
	}
	return true;
}
void main()
{
	int p=2;
	cout<<"p\t\t2^p-1"<<endl;
	while(p<=31)
	{
		int i=pow(2,p)-1;
		if(judge(i))
		{
			cout<<p<<"\t\t"<<i<<endl;
		}
		p++;
	}
}

30 30 30.双素数

双素数,指的是一对差值为2的素数
双素数 指的是一对差值为2的素数,例如:5和7就是一对双素数,找出小于1000的所有双素数,显示结果格式为(n,m)

#include
#include
using namespace std;
int a[1000];
void judge(int* a)///埃氏筛选法
{
	a[0]=1;
	a[1]=a[0];
	for(int i=2;i<1000;i++)
	{
		if(!a[i])
		{
			for(int j=i*i;j<1000;j+=i)
			{
				a[j]=1;
			}
		}
	}
}
void main()
{
	judge(a);
	for(int i=2;i<998;i++)
	{
		if(!a[i]&&!a[i+2])
		{
			cout<<"("<<i<<","<<i+2<<")"<<endl;
		}
	}
}

31 31 31.双骰子赌博

掷两个骰子。每个骰子有六面,检查两个骰子的和。如果和为2、3或12(称为掷骰子),你就输了;如果和为7或11(称作自然),你就赢了;但如果和是其他数字,就确定了一个点。继续掷骰子,直到掷出一个7或掷出和刚才相同的点数。如果掷出的是7,你就输了。如果掷出的点数和你前一次掷出的点数相同,你就赢了。

#include
#include
using namespace std;
void main()
{
	int last=0;
	srand((unsigned)time(0));
	int a,b;
	while(1)
	{
		a=rand()%6+1;
		b=rand()%6+1;
		cout<<"你掷出了"<<a<<"和"<<b<<" ";
		if(last==0)
		{
			if(a+b==2||a+b==3||a+b==12)
			{
				cout<<"你输了"<<endl;
				break;
			}
			if(a+b==7||a+b==11)
			{
				cout<<"你赢了"<<endl;
				break;
			}
		}
		else
		{
			if(a+b==7)
			{
				cout<<"你输了"<<endl;
				break;
			}
			else if(a+b==last)
			{
				cout<<"你赢了"<<endl;
				break;
			}
		}
		last=a+b;
		cout<<"继续掷骰子"<<endl;
		system("pause");
	}
}

32 32 32.金融应用:信用卡号的合法性验证

一个信用卡号必须是13到16位的整数。它的开头必须是:
4     Visa卡
5     Master卡
37   American Express卡
6     Discover卡
      1954年,IBM的Hans Luhn提出一种算法,用于验证信用卡卡号的有效性。这个算法在确定输入的卡号是否正确,或者这张信用卡是否被扫描仪正确扫描方面是非常有用的。
遵循这个合法性检测可以生成所有的信用卡号,通常称之为Luhn检测或者Mod 10检测,可以如下描述(为了方便解释,假设卡号4388576018402626:

  1. 从右到左对偶数位数字翻倍。如果对某个数字翻倍之后的结果是一个两位数,那么就将这两位加在一起得到一位数。
  2. 现在将第一步得到的所有一位数相加。
  3. 将卡号里从右到左奇数位上的所有数字相加。
  4. 将第二步和第三步得到的结果相加。
  5. 如果第四步得到的结果能被10整除,那么卡号是合法的;否则,卡号是不合法的。

例如,号码4388576018402626是不合法的,但是号码4388576018410707是合法的。

#include
#include
using namespace std;
void main()
{
	string s;
	cin>>s;
	int res=0;
	for(int i=0;i<s.length();i++)
	{
		if(i%2==0)
		{
			res+=(s[i]-48)*2>=10?(s[i]-48)*2/10+(s[i]-48)*2%10:(s[i]-48)*2;
		}
		else
		{
			res+=s[i]-48;
		}
	}
	if(res%10==0&&(s[0]=='4'||s[0]=='5'||s[0]=='3'&&s[1]=='7'||s[0]=='6')&&s.length()<=16&&s.length()>=13)
	{
		cout<<"卡号合法"<<endl;
	}
	else
	{
		cout<<"卡号不合法"<<endl;
	}
}

你可能感兴趣的:(36道C++算法题)