蓝桥杯练习题库

蓝桥杯练习题库

  • 一、 基础
    • 1.暴力枚举
      • 猜年龄
      • 网友年龄
      • 生日年龄数
      • 数学题
      • 马虎的算式
      • 奇怪的分式
      • 几何题
    • 2.模拟题
      • 1200000的约数有多少?(只计算正约数)
      • 在1至2019中,有多少个数的数位中包含数字9?
      • 给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
    • 3.其余题目
      • Hanoi(汉诺)塔问题
      • 输入10个数,要求输出其中最大的元素和该数是第几个数
      • 最大公约数与最小公倍数
  • 二、省赛
    • 1.十一届
      • 填空
        • 门牌制作
        • 既约分数
    • 2.十二届
      • 时间显示
  • 三、蓝桥杯练习系统
    • 1.基础练习
      • 杨辉三角形
      • 序列求和
      • 查找整数
      • 特殊的数字(水仙花数)
      • 回文数
      • 特殊回文数
      • 10进制转16进制
      • vip-分解质因数
      • vip-时间转换(简单)
      • vip-字符串对比
      • vip-矩阵乘法
      • vip-矩阵面积交
      • vip-芯片测试
    • 2.算法训练
      • 暗恋
      • 判定数字
      • 十进制数转八进制数
      • 斜率计算
      • 薪水计算
      • 整除问题
      • 奇偶判断
      • 平方计算
      • 连接字符串
      • 完数
      • 4-2找公倍数
      • 6-2递归求二进制表示位数
      • sign函数
      • P0103
      • 大小写转换
      • P0505
      • 1的个数
      • 大等于n的最小平方数
      • 企业奖金发放
      • 一元一次方程
      • 简单加法(基本型)
    • 3.算法提高
      • 字符串顺序比较
      • 递归输出
      • 约数个数
      • 计数问题
      • 利息计算
      • 简单加法
      • 三个整数的排序
      • 勾股数
      • 输入输出格式练习
      • 征税程序
      • 算术运算
      • 填充蛋糕
      • 数的运算
      • 统计平均成绩
      • 时间转化
      • 选最大数
      • 温度转换
      • Quadratic Equation(解方程)
      • c++_ch02_02(switch语句)
      • c++_ch02_03(石头剪刀布)
      • 3-2字符串输入输出函数
      • c++_ch02_04
      • 3-1课后习题2(求和)
      • P0104(1的位数)
      • p0402(猴子吃桃问题)
      • c++_ch02_01(ascii码)
      • 7-1用宏求球的体积
      • 7-2求arccos值
      • p0101
      • JOE的算数
      • 求最大公约数
      • Hankson 的趣味题(最大公约数最小公倍数)

一、 基础

1.暴力枚举

猜年龄

/***
	美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。
	他曾在1935~1936年应邀来中国清华大学讲学。 
	一次,他参加某个重要会议,年轻的脸孔引人注目。
	于是有人询问他的年龄,
	他回答说:“我年龄的立方 是个4位数。
	我年龄的4次方是个6位数。
	这10个数字正好包含了从0到9这10个数字,
	每个都恰好出现1次。”
	请你推算一下,他当时到底有多年轻。
	直接提交他那时的年龄数字。
答案:18
思路:通过暴力破解的方法,
	找到年龄的大概范围,
	假设他的年龄为x,10^3=1000, 30^4=8100,
	说明x的范围在[10,30]之间。
***/
#include
#include
int main(){
	int year;
	int i;
	for(i = 10;i<=30;i++){//猜测在10~30间的年龄
			printf("%d %.0f  %.0f\n",i,pow(i,3),pow(i,4));
	} 
	return 0;
} 

网友年龄

/***
	某君新认识一网友。当问及年龄时,他的网友说:
	“我的年龄是个2位数,我比儿子大27岁,
	如果把我的年龄的两位数字交换位置,刚好就是我儿子
	的年龄”
	请你计算:网友的年龄一共有多少种可能情况?
	提示:30岁就是其中一种可能哦.
	请填写表示可能情况的种数。
答案:7
思路:网友的年龄比他儿子大27,就说明网友至少27岁,
	即为初始值为27,两位数最大也就是99,范围【27,99】,
	假设网友年龄为i,设个位为b,十位数为10a,
	把他的年龄数字交换位置正好是他的儿子的年龄,
	那么他儿子的年龄为10b+a,
	判断条件是网友的年龄减去27等于他儿子的年龄,
	sum累加几种可能性。
***/
#include
int main(){
	int son,year,count =0;
	int i;
	for(i = 27;i<=99;i++){
		if(i-27==(i%10)*10+(i/10)) 
			printf("%d\n",i);
	}
	return 0;
} 

生日年龄数

/***
	某君从某年开始每年都举办一次生日party,
	并且每次都要吹熄与年龄相同根数的蜡烛。
	现在算起来,他一共吹熄了236根蜡烛。
	请问,他从多少岁开始过生日party的?
	请输出他开始过生日party的年龄数。
注意:你输出的应该是一个整数,
	不要输出任何多余的内容或说明性文字。
输入
	没有输入。
输出
	输出一个整数,即某君开始过生日party的年龄数
提示
	用printf或cout输出答案。
答案:26
思路:假设i为初始年龄,j为终止年龄,j肯定要大于i,
	那么j=i+1,k为多少根蜡烛!暴力累加。
***/
#include
int main(){
	int i,j,k;

	for(i=1;i<=100;i++){//开始过的年龄
		for(j=i+1;j<=100;j++){//终止的年龄 
			int sum=0;
			for(k=i;k<=j;k++){
				sum+=k;
			}	
			if(sum==236){
				printf("%d ",i);

			}
		}
	}
	return 0;
} 

数学题

/***
	有限五位数,个位数为6且能被3整除的五位数有多少个?
答案:3000 
思路:首先分析5位数的范围【10000,99999】,
	个位数为6说明至少两位数,并对3取余,ans累加。
***/
#include
int main(){
	int i;
	int count =0;
	for(i=10000;i<=99999;i++){
		if(i%10==6&&i%3==0)
			count++;
	} 
	printf("%d ",count) ;
	return 0;
}

马虎的算式

/***
	小明是个急性子,上小学的时候经常把老师写在黑板上的
	题目抄错了。
	有一次,老师出的题目是:36 x 495 =? 
	他却给抄成了:396 x 45 = ? 但结果却很戏剧性,
	他的答案竟然是对的!! 
	因为 36 * 495 = 396 * 45= 1782 类似这样的巧合
	情况可能还有很多,比如:27* 594 = 297 * 54
	假设 a b c d e 代表1~9不同的5个数字
	(注意是各不相同的数字,且不含0)
	能满足形如: ab * cde = adb* ce 
	这样的算式一共有多少种呢?
	请你利用计算机的优势寻找所有的可能,
	并回答不同算式的种类数。
	满足乘法交换律的算式计为不同的种类,
	所以答案肯定是个偶数。
	答案直接通过浏览器提交。
	注意:只提交一个表示最终统计种类数的数字,
	不要提交解答过程或其它多余的内容。
答案:142
思路:假设a b c d e 代表1~9不同的5个数字,
	a b c d e的范围在【1,9】,有多少种结果用ans累加法,
	通过判断条件abcde=adbce满足条件累加1,
	然后有一种可能就是a与b相等,
	所以判断否定a不等于b,其他字母也一样。
***/
 #include
 int main(){
 	int sum=0,m,n;
 	int a,b,c,d,e;
 	for(a = 1;a<=9;a++){
 		for(b = 1;b<=9;b++){
 			for(c = 1;c<=9;c++){
 				for(d =1;d<=9;d++){
 					for(e =1;e<=9;e++){
 						
 						m = (a*10+b)*(c*100+d*10+e);
 						n = (a*100+d*10+b)*(c*10+e);
 						if(m==n&&a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e){
 							sum++;
 						}
 					}
 				}
 			}
 		}
 	}
 	printf("一共%d种",sum);
 	return 0;
 }

奇怪的分式

/***
	上小学的时候,小明经常自己发明新算法。一次,
	老师出的题目是: 1/4 乘以 8/5 
	小明居然把分子拼接在一起,分母拼接在一起,
	答案是:18/45。
	老师刚想批评他,转念一想,这个答案凑巧也对啊,
	真是见鬼!
	对于分子、分母都是 1~9 中的一位数的情况,
	还有哪些算式可以这样计算呢? 请写出所有不同算式的个数
	(包括题中举例的)。
	显然,交换分子分母后,例如:4/1 乘以 5/8 
	是满足要求的,这算做不同的算式。
	但对于分子分母相同的情况,2/2 乘以 3/3 
	这样的类型太多了,不在计数之列!
	
	注意:答案是个整数(考虑对称性,肯定是偶数)。
	请通过浏览器提交。不要书写多余的内容。

答案:14
思路:其实跟上一道差不多,找出范围,找出判断条件,
	找出不符合条件,利用累加ans
	注意不可以用(a/b)*(c/d)==((a*10+c)/b*10+d)),
	而是利用数学里面的十字相乘法
***/
#include
int main(){
	int a,b,c,d;
	int sum=0;
	for(a=1;a<=9;a++){
		for(b=1;b<=9;b++){
			for(c=1;c<=9;c++){
				for(d=1;d<=9;d++){
					if(a==b&&c==d)
						continue;
					int e=a*10+c,f=b*10+d;
					if(a*c*f==b*d*e){
						sum++; 
					}
						
				}
			}
		}
	}
	printf("%d",sum);
	return 0;
}

几何题

/***
小蓝有一个超大的仓库,可以摆放很多货物。现在,小蓝有 n 箱货物要摆放在仓库,每箱货物都是规则的正方体。
小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的立方体。
即在长、宽、高的方向上分别堆 L 、 W 、 H 的货物,满足 n = L × W × H。给定 n ,
请问有多少种堆放货物的方案满足要求。

例如,当 n = 4 时,有以下 6 种方案:1 × 1 × 4 、 1 × 2 × 2 、 
1 × 4 × 1 、 2 × 1 × 2 、 2 × 2 × 1 、 4 × 1 × 1

请问,当 n = 2021041820210418 (注意有 16位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。
思路分析:循环暴力枚举解决法,理论上可以,可行性不行,
	转换思路分解出整个数字的所有因(约)数,
	然后对所有的因数暴力枚举两重循环,计
	算出结果。
答案:2430 
***/
#include
int hanshu(long long int a,long long int  b,long long int c){
	if(a==b&&a==c){//长=宽=高,一种排列组合 
		return 1;
	}
	if(a==b&&a!=c||a==c&&a!=b||b==c&&a!=b){//长宽高 任意两个相同排列只有三种 
		return 3;
	} 
	else 
		return 6;//长宽高都不相同排列只有6种 
}
int main(){
	long long n=2021041820210418;
	long long int L,W,H;
	long long sum=0;
	for(L=1;L*L*L<=n;L++){//L是最小的一方 
		if(n%L==0){
			for(W=L;L*W*W<=n;W++){//L是第二大的一方,次数多 
				if(n%(L*W)==0){
					H=n/L/W;
					if(H>=W){
					sum+=hanshu(L,W,H);
					} 
				} 	
			} 
		}
	} 
	printf("%d",sum);
	return 0;
} 

2.模拟题

1200000的约数有多少?(只计算正约数)

#include
int main(){
	int n;
	scanf("%d",&n);
	int i,count=0;
	for(i=1;i<=n;i++){//约数包含1和本身 
		if(n%i==0)
		count+=1;;
	}
	printf("%d",count);
	return 0;
}

在1至2019中,有多少个数的数位中包含数字9?

#include
int main(){
	int i;
	int count=0;
	for(i=1;i<=2019;i++){
		if(i/1000==9)
			count++;
		else if(i/100%10==9)
			count++;
		else if(i/10%10==9)
			count++;
		else if(i%10==9)
			count++;
	}
	printf("%d",count);
	return 0;
}

给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?

/***
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,
例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
***/
#include
int main(){
	long int n;
	scanf("%ld",&n);
	int a,b,c,d,e,f; // 根据n的评测范围,定义6个长整型变量 
	int i,count=0;
	for(i=1;i<=n;i++){
		if(i<10){//1到9肯定都符合,但不能因此省略,否侧测试数据小于9就出错了 
			continue;
		}
		if(i>=10&&i<100){//2位数
			a=i/10;//十位
			b=i%10;//个位
			if(a<=b){
				count++;
				continue;//该数符合条件后则返回进行下一个数的判断 
			} 
		}
		if(i>=100&&i<1000)//3位数,以下思路同上 
		{
			a=i/100;
			b=i/10%10;
			c=i%10;
			if(a<=b&&b<=c)
			{
				count++;
				continue;
			}
		}
		if(i>=1000&&i<10000)//4位数 
		{
			a=i/1000;
			b=i/100%10;
			c=i/10%10;
			d=i%10;
			if(a<=b&&b<=c&&c<=d)
			{
				count++;
				continue;
			}
		}
		if(i>=10000&&i<100000)//5位数 
		{
			a=i/10000;
			b=i/1000%10;
			c=i/100%10;
			d=i/10%10;
			e=i%10;
			if(a<=b&&b<=c&&c<=d&&d<=e)
			{
				count++;
				continue;
			}
		}
		if(i>=100000&&i<1000000)//6位数 
		{
			a=i/100000;
			b=i/10000%10;
			c=i/1000%10;
			d=i/100%10;
			e=i/10%10;
			f=i%10;
			if(a<=b&&b<=c&&c<=d&&d<=e)
			{
				count++;
				continue;
			}
		}
	}
	printf("%ld",count);
	return 0;
} 

3.其余题目

Hanoi(汉诺)塔问题

#include
void hanoi(int n,char one,char two,char three){
	void move(char x,char y);//声明函数 
	if(n==1)
		move(one,three);
	else{
		hanoi(n-1,one,three,two);//将n-1个盘子从A借助C移到B 
		move(one,three);//将A上最后一个盘子移到C 
		hanoi(n-1,two,one,three);//将n-1个盘子从B借助A移到C 
	}
}
void move(char x,char y){
	printf("%c-->%c\n",x,y);
} 
int main(){
	int m;
	scanf("%d",&m);
	hanoi(m,'A','B','C'); 
	return 0;
} 

输入10个数,要求输出其中最大的元素和该数是第几个数

#include
int main(){
	int max(int x,int y);
	int a[10],m,n,i;//n记录数组元素的序号   
	for(i=0;i<10;i++){
		scanf("%d",&a[i]);
	}
	printf("\n");
	for(i=1,m=a[0],n=0;i<10;i++){//先默认a[0]最大 
		if(max(m,a[i])>m){
			m=max(m,a[i]);
			n=i;
		}
	}
	printf("最大数%d\n第%d位\n",m,n+1);
	return 0;
} 
int max(int x,int y){
	return x>y?x:y;
}

最大公约数与最小公倍数

#include
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int main(){
	int a,b;
	scanf("%d %d",&a,&b);
	int c=gcd(a,b);
	printf("%d\n",c);
	printf("%d\n",a*b/c);//最小公倍数=a*b/最大公约数
	return 0;
}

二、省赛

1.十一届

填空

门牌制作
/***
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最
后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,
即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
***/
#include
int main(){
	int i;
	for(i =1;i<=2020;i++){
		printf("%d ",i);
	}
	return 0;
} 
//输出结果复制至文档,替换2即可,结果624 
既约分数
/***
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如,4/3,5/2,1/8,7/1都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?
***/
#include 
#include 
int main()
{
    int n,m;  //中间变量
    int temi,temj;  
    int sum=0;  //既约分数总数
    for(int i=1; i<=2020; i++)  //分子
    {
        for(int j=1; j<=2020; j++)  //分母
        {
            temi=i;  //暂存分子分母
            temj=j;
            if(temi<temj){
                n=temi;
                temi=temj;
                temj=n;
            }
            while(temi%temj!=0)  //大的在%左边,小的在%右边
            {
                m=temi%temj;
                temi=temj;
                temj=m;
            }
            if(temj==1){  //temj=1说明分子分母最大的公约数是1
                sum++;  //总数加1
            }
        }
    }
    printf("%d",sum);
    return 0;
}

2.十二届

时间显示

/***
***/
#include
int main(){
	long long int n;
	scanf("%lld",&n);
	int hh,mm,ss;
	n=n/1000;//去掉末尾毫秒
	n=n%(3600*24);//去掉日期 
	
	hh=n/3600;//取出小时  
	n=n%3600;//去掉小时 
	
	mm=n/60;///取出分钟 
	ss=n%60; //去掉分钟
	printf("%02d:%02d:%02d",hh,mm,ss); 
	return 0;
} 

三、蓝桥杯练习系统

1.基础练习

链接: https://space.bilibili.com/471791100/video?tid=0&page=2&keyword=&order=pubdate.

杨辉三角形

//杨辉三角形
/***
问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。

  
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。

  
下面给出了杨辉三角形的前4行:

  
   1

  
  1 1

  
 1 2 1

  
1 3 3 1

  
给出n,输出它的前n行。

输入格式
输入包含一个数n。

输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。
***/
#include
#define N 34
int main(){
	int num[N][N]={{1},{1,1}};
	int n,i,j;//行数  循环数 
	scanf("%d",&n);
	//先生成数据 
	for(i = 2;i< n;i++){//行 
		num[i][0] = num[i][i]=1; //每行首尾为1
		for(j = 1;j<i;j++){
			num[i][j]=num[i-1][j-1]+num[i-1][j];
		} 	
	}
	//再输出数据
	for(i=0;i<n;i++){
		for(j=0;j<=i;j++){
			printf("%d ",num[i][j]);
		}
		printf("\n");
	}	 
	return 0;
	
}

序列求和

//序列求和   注意n的范围 
/***
问题描述
求1+2+3+...+n的值。
输入格式
输入包括一个整数n。
输出格式
输出一行,包括一个整数,表示1+2+3+...+n的值。
样例输入
4
样例输出
10
样例输入
100
说明:有一些试题会给出多组样例输入输出以帮助你更好的做题。

一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低。

样例输出
5050
数据规模与约定
1 <= n <= 1,000,000,000。
***/
#include
int main(){
	long long n;
	scanf("%lld",&n);
	long long i,sum=0;
	for(i = 1;i <= n;i++)
		sum = sum+i;
	printf("%lld",sum);
	return 0;
		
		
} 

查找整数

//查找整数
/***
问题描述
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

输入格式
第一行包含一个整数n。

第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。

第三行包含一个整数a,为待查找的数。

输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
样例输入
6
1 9 4 8 3 9
9
样例输出
2
数据规模与约定
1 <= n <= 1000。
***/ 

#include
#define N 1000
int main(){
	int n,i,m,num[N] = {0};
	int post = -1;//初始化位置 
	scanf("%d",&n);
	for(i = 0;i < n;i++){
		scanf("%d",&num[i]);
	}
	scanf("%d",&m);
	for(i=0;i<n;i++){
		if(num[i] == m){
			post = i+1;
			break;
		}
	} 
	printf("%d",post);
	return 0;
} 

特殊的数字(水仙花数)

//特殊的数字
/***
问题描述
  153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。
	编程求所有满足这种条件的三位十进制数。
输出格式
  按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。
***/ 
#include
int main(){
	int g,s,b;//个十百
	int n;//循环遍变量
	for(n = 100;n<=999;n++){
		b = n/100;
		s=n%100/10;
		g=n%10;
		if(b*b*b+s*s*s+g*g*g==n)
			printf("%d\n",n);
		
	} 
	return 0; 
}

回文数

//回文数
/***
问题描述
  1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
输出格式
  按从小到大的顺序输出满足条件的四位十进制数。
***/ 
#include
int main(){
	int ge,shi,bai,qian,n;
	for(n = 1000;n<=9999;n++){
		qian = n/1000;
		bai = n%1000/100;
		shi=n%100/10;
		ge=n%10;
		if(qian==ge&&bai==shi)
			printf("%d\n",n);
	}
	return 0;
} 

特殊回文数

//特殊回文数
/***
问题描述
  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
  输入一行,包含一个正整数n。
输出格式
  按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
  1<=n<=54。
***/ 
#include
#define N 54
int main(){
	int n,i;
	scanf("%d",&n);
	int ge,shi,bai,qian,wan,shiwan;
	for(i=10000;i<=999999;i++){
		shiwan = i/100000;
		wan = i%100000/10000;
		qian = i%10000/1000;
		bai=i%1000/100;
		shi=i%100/10;
		ge=i%10;
		if(i >=100000 && i <= 999999) 
			if(shiwan + wan+qian+bai+shi+ge==n && shiwan==ge && wan==shi && qian==bai )
				printf("%d\n",i);
		if(i >=10000 && i <= 99999) 
			if(wan+qian+bai+shi+ge==n &&  wan==ge && qian==shi )
				printf("%d\n",i);
			
	}
	return 0;
}

10进制转16进制

//十进制转十六进制
/***
问题描述
  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,
	分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,
	而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
  给出一个非负整数,将它表示成十六进制的形式。
输入格式
  输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
  输出这个整数的16进制表示
样例输入
30
样例输出
1E
***/

//2147483647用程序员计算器转换是一个八位的字符串 
#include
#define N 8//字符串长度 
int main(){
	int a,j;
	int len=0;
	int mod;
	scanf("%d",&a);
	char num[N];//转换后的16进制数组 
	if(a==0)
		printf("0"); 	
	while(a!=0){
		mod = a % 16;
		if(mod>=0 && mod <=9)
			num[len++]=mod+'0';
		if(mod>=10&&mod<=15)
			num[len++]=mod+'A'-10;
		a=a/16;//辗转求余 
	}
	for(j=len-1;j>=0;j--)
		printf("%c",num[j]);
	return 0;
} 


/*** 法二 
#include
int main(){
	int n;
	int mod;//取余 
	char str[100000];
	int i=0,j;
	scanf("%d",&n);
	if(n == 0)
		printf("0");
	while(n != 0){
		mod = n % 16;
		if(mod >= 0 && mod <= 9)
			str[i++] = mod + '0';
		if(mod >= 10 && mod <= 15)
			str[i++] = mod + 'A'- 10;
		n = n/16; 
	}
	for(j = i-1;j >= 0;j--)//倒叙输出 
		printf("%c",str[j]);
	return 0;
} 
***/ 

vip-分解质因数

/***
问题描述
  求出区间[a,b]中所有整数的质因数分解。
输入格式
  输入两个整数a,b。
输出格式
  每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
提示
  先筛出所有素数,然后再分解。
数据规模和约定
  2<=a<=b<=10000
***/
#include
#include
//检查一个整数是否是素数 
int isprime(int n){
	int result = 1;//默认是素数
	int i; 
	for(i = 2;i<=sqrt(n);i++){
		if(n%i==0){
			result = 0;
			break;
		}
	}
	return result; 
}
int main(){
	int a,b;
	scanf("%d %d",&a,&b); 
	int i,j,temp;
	//遍历
	for(i =a;i <=b;i++){
		if(isprime(i))//如果是素数 
			printf("%d=%d\n",i,i);//输出自身 
		else {//不是素数  和数的求解(非质数)   8=2*2*2 
			temp = i;//临时变量记录;因为在运算过程中商的值不断变化,所以临时变量temp记录i作为除数和商 
			printf("%d=",temp);//开始输出,如8= 
			for(j=2;j<temp;j++){
				if(isprime(j)){//循环变量j是素数 
					while(temp%j==0) {
						printf("%d*",j);//计算过程 
						temp = temp/j;//商 
						
						if(isprime(temp)) 
						{
							printf("%d",temp); 
							break;
						} 
					}
				}
				
			} 
			printf("\n");
			
		} 
		
	} 
	
	return 0;
}

/***法二
#include 
#include 


int main()
{
    int a,b,i,j;
    scanf("%d%d",&a,&b);

    for(i=a;i<=b;i++){
        int n = i;
        printf("%d=",n);//打印当前待分解的数

        for(j=2;j*j <= n;j++){
            while(n%j ==0){
                    //如果n可以被j整除,打印j的值,将n/j的商作为新的n,执行(1)
                n = n/j;
                printf("%d",j);

                if(n!= 1){ //被除数不是1,还可以继续分解,打印乘号*
                    printf("*");
                }
            }
        }

        if(n != 1){
            printf("%d",n);
        }
        printf("\n");
    }

    return 0;
} 
***/


/***
//输出素数 
#include
#include
int isprime(int n){
	int result = 1;//默认是素数
	int i;
	for(i = 2;i <=sqrt(n);i++)
		if(n %i ==0){
		
		 	result = 0;
		 	break;
		 }
	return result; 
}
int main(){
	int n = 200;
	int i;
	for(i = 100;i<=n;i++){
		if(isprime(i))
			printf("%d\n",i);
		
	}
	return 0;
}
***/ 

vip-时间转换(简单)

/***时间转换
问题描述
  给定一个以秒为单位的时间t,要求用“::”的格式来表示这个时间。
	表示时间,表示分钟,而表示秒,它们都是整数且没有前导的“0”。
	例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。
输入格式
  输入只有一行,是一个整数t(0<=t<=86399)。
输出格式
  输出只有一行,是以“::”的格式所表示的时间,不包括引号。
样例输入
0
样例输出
0:0:0
样例输入
5436
样例输出
1:30:36 

***/
#include
int main(){
	int t;
	scanf("%d",&t); 
	int H,M,S;
	if(t ==0){
		H=M=S=0;
		printf("%d:%d:%d",H,M,S);
	}
	else{
		H = t/3600;
		M=t%3600/60;
		S=t%3600%60;
		printf("%d:%d:%d",H,M,S);
	}
	return 0;
}

vip-字符串对比

/***
问题描述
  给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:
  1:两个字符串长度不等。比如 Beijing 和 Hebei
  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing
  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。
		比如 beijing 和 BEIjing
  4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing
  编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。
输入格式
  包括两行,每行都是一个字符串
输出格式
  仅有一个数字,表明这两个字符串的关系编号
样例输入
BEIjing
beiJing 
样例输出
3
***/
#include
#include
#define N 10
int main(){
	char num1[N],num2[N];
	int i,k=0;
	scanf("%s",&num1);
	scanf("%s",&num2);
	int len1 = strlen(num1);
	int len2 = strlen(num2);
	if(len1!=len2)
		printf("1");
	else{
		if(strcmp(num1,num2)==0)
			printf("2");
		else{
		
			for(i =0;i<N;i++){
				if((num1[i]==num2[i]+32||num1[i]==num2[i]-32||num1[i]==num2[i])&&num1[i]!='\0')
				//if(num1[i]==num2[i]+32||num1[i]==num2[i]-32||num1[i]==num2[i])
					k++;
			}
			if(k==len1)
				printf("3");
			else
				printf("4");
		}
		
	}
	return 0;
}
/*** 法二   :75分 
#include
#include
#include//字符串操作 
#define N 10
//比较字符串,不区分大小写的情况 
int mystrcmp(char a[N],char b[N]){
	int result = 1;//默认为1 相同 
	int i;
	int len = strlen(a); 
	for(i = 0 ;i < len;i++){
		if(tolower(a[i])!=tolower(b[i]))
			result = 0;
			break;
	}
	return result;
}
int main(){
	char num1[N];
	char num2[N];
	int a,b,c,d;//代表1,2,3,4种情况 
	int i; 
	scanf("%s",&num1);
	scanf("%s",&num2);
	int len1 = strlen(num1);
	int len2 = strlen(num2);
	//第一种情况
	if(len1 != len2){ 
		printf("1\n");
	}
	else{
		if(strcmp(num1,num2)==0)
			printf("2");
		else if(mystrcmp(num1,num2)==1){
			printf("3"); 	
		}
		else{
			printf("4");
		}

	}
	//printf("%s\n%s\n%d %d",num1,num2,len1,len2);	 
	return 0;
}

***/ 

vip-矩阵乘法

/***
问题描述
  给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
  例如:
  A =
  1 2
  3 4
  A的2次幂
  7 10
  15 22
输入格式
  第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
  接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输出格式
  输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
***/ 
//33分? 
#include
#define N 30
#define M 5 
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	int i,j;//循环变量 
	int num[N][N]={0};//输入的矩阵
	int temp[N][N]={0}; //临时变量计算结果 
	int temp1[N][N]={0};//临时变量存储每一次的计算结果 
	int k,p;//循环变量 
	//二维数组的输入 
	for(i = 0;i< n;i++){
		for(j = 0;j<n;j++){
			scanf("%d",&num[i][j]); 	
			temp[i][j] = num[i][j]; 
		}
	}
	//计算次幂
	if(m == 0){//0次幂,单位矩阵 
		for(i = 0;i< n;i++){
			for(j = 0;j<n;j++){
				if(i==j)//对角线上 
					temp[i][j]=1;
				else
					temp[i][j]=0;
			}
		}
	}
	else{//非0次幂 
		for(k = 1;k<m;k++){//乘方进行遍历 
			for(i = 0;i < n;i++){
				for(j = 0;j<n;j++){
					temp1[i][j] = 0;
					for(p = 0;p <n;p++){
						temp1[i][j] += (temp[i][p]*temp[p][j]);	//当前行当前列*当前列任意行			
					}
				}
				
			}
		} 
		//把temp1赋值给temp
		for(i = 0;i< n;i++){
			for(j = 0;j<n;j++){
				temp[i][j] = temp1[i][j];	
			}
		}
	}
	//输出结果 
	for(i = 0;i< n;i++){
		for(j = 0;j<n;j++){
			printf("%d ",temp[i][j]); 	
		}
		printf("\n");
	}
	return 0;
} 

vip-矩阵面积交

vip-芯片测试

/***
问题描述
  有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
  每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
  给出所有芯片的测试结果,问哪些芯片是好芯片。
输入格式
  输入数据第一行为一个整数n,表示芯片个数。
  第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为0或1,在这n行中的第i行第j列(1≤i, j≤n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。芯片不能对本身进行测试)。
输出格式
  按从小到大的顺序输出所有好芯片的编号
样例输入
3
1 0 1
0 1 0
1 0 1
样例输出
1 3
***/
#include
#define N 20
int main(){
	int n;//芯片个数
	scanf("%d",&n);
	int num[N][N];
	int sum[20]={0};
	int i,j;
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			scanf("%d",&num[i][j]); 
			if(num[i][j] == 1){
				sum[j]++;//统计合格芯片的次数 
			}
		}
	}
	for(i=1;i<=n;i++){
		if(sum[i]>n/2)//合格次数大于n/2芯片 
		{
			printf("%d ",i);
		}
		
	} 

	return 0;
}

2.算法训练

暗恋

/***
问题描述
  同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事。
	暗恋,是他唯一能做的事。他只能在每天课间操的时候,望望她的位置,
	看看她倾心的动作,就够了。操场上的彩砖啊,你们的位置,就是他们能够站立的地方,
	他俩的关系就像砖与砖之间一样固定,无法动摇。还记得当初铺砖的工人,
	将整个操场按正方形铺砖
	(整个操场可视为R行C列的矩阵,矩阵的每个元素为一块正方形砖块),
	正方形砖块有两种,一种为蓝色,另一种为红色。
	我们定义他和她之间的“爱情指标”为最大纯色正方形的面积,
	请你写一个程序求出“爱情指标”。
输入格式
  第一行两个正整数R和C。
  接下来R行C列描述整个操场,红色砖块用1来表示,蓝色砖块用0来表示。
输出格式
  一个数,表示他和她之间的“爱情指标”。
样例输入
	5 8
	0 0 0 1 1 1 0 1
	1 1 0 1 1 1 1 1
	0 1 1 1 1 1 0 1
	1 0 1 1 1 1 1 0
	1 1 1 0 1 1 0 1
样例输出
	9
数据规模和约定
  40%的数据R,C<=10;
  70%的数据R,C<=50;
  100%的数据R,C<=200;
***/
#include
#define N 200
#define M 200
int m,n;
int num[N][M];
//找出面积最大的正方形 
int max(int a,int b){
	return a>b?a:b;
} 
int find(int x,int y){
	int result;
	int i,j;
	for(result = 2;x+result-1<m&&y+result-1<n;result++){
		for(i=x;i<=x+result-1;i++){
			if(num[i][y+result-1] != num[x][y])
				return (result-1)*(result-1);
		}
		for(j=y;j<=y+result-1;j++){
			if(num[x+result-1][j] != num[x][y])
				return (result-1)*(result-1);
		}
		
	}
	
	return (result-1)*(result-1);
}
int main(){
	//int m,n;
	scanf("%d %d",&m,&n);//m行n列
	int i,j;//循环变量
	//int num[N][M];
	for(i = 0;i<m;i++){
		for(j=0;j<n;j++){
			scanf("%d",&num[i][j]);
		}
	} 
	
	int max_area =1;
	for(i = 0;i<m;i++){
		for(j =0;j<n;j++){
			max_area=max(max_area,find(i,j));	
		}
	}
	printf("%d",max_area);
	return 0;
}

判定数字

/***
编写函数,判断某个给定字符是否为数字。
样例输入
9
样例输出
yes
***/
#include
int main(){
	char n;
	scanf("%c",&n);
	if(n>='0'&&n<='9') 
		printf("yes");
	else
		printf("no"); 
	return 0; 
} 

十进制数转八进制数

/***
 编写函数把一个十进制数输出其对应的八进制数。
样例输入
9274
样例输出
22072
***/
#include
int main(){
	int t;
	scanf("%d",&t);
	printf("%o",t);
	return 0; 
}

斜率计算

/***
输入两个点的坐标,即p1 = (x1, y1)和p2=(x2, y2),求过这两个点的直线的斜率。如果斜率为无穷大输出“INF”。
样例输入
1 2
2 4
样例输出
2
样例输入
1 2
1 4
样例输出
INF
样例输入
1 2
3 2
样例输出
0
***/
#include  
int main()
{  
   int a,b,c,d;  
   scanf("%d%d",&a,&b);  
   scanf("%d%d",&c,&d);  
   if(a==c)  
       printf("INF\n");  
   else   
       printf("%d\n",(b-d)/(a-c));  
   return 0;  
 }

薪水计算

/***
/***
问题描述
  编写一个程序,计算员工的周薪。薪水的计算是以小时为单位,如果在一周的时间内,员工工作的时间不超过40 个小时,那么他/她的总收入等于工作时间乘以每小时的薪水。如果员工工作的时间在40 到50 个小时之间,那么对于前40 个小时,仍按常规方法计算;而对于剩余的超额部分,每小时的薪水按1.5 倍计算。如果员工工作的时间超过了50 个小时,那么对于前40 个小时,仍按常规方法计算;对于40~50 个小时之间的部分,每小时的薪水按1.5 倍计算;而对于超出50 个小时的部分,每小时的薪水按2 倍计算。请编写一个程序,输入员工的工作时间和每小时的薪水,然后计算并显示他/她应该得到的周薪。
  输入格式:输入只有一行,包括一个整数和一个实数,分别表示工作时间和每小时薪水。
  输出格式:输出只有一个实数,表示周薪,保留小数点后2位。
  输入输出样例
样例输入
40 50
样例输出
2000.00
***/
#include
int main(){
	int t;
	float m;
	scanf("%d %f",&t,&m);
	if(t>=0&&t<=40){
		printf("%.2f",t*m);
	}
	else{
		t=t-40;
		if(t<=10){
			printf("%.2f",t*m*1.5+40*m);
		}
		else{
			t=t-10;
			printf("%.2f",t*m*2+10*m*1.5+40*m);
		}
	} 
	return 0;
	 
} 

整除问题

/***
问题描述
  编写一个程序,输入三个正整数min、max和factor,然后对于min到max之间的每一个整数(包括min和max),如果它能被factor整除,就把它打印出来。
  输入格式:输入只有一行,包括三个整数min、max和factor。
  输出格式:输出只有一行,包括若干个整数。
  输入输出样例
样例输入
1 10 3
样例输出
3 6 9
***/
#include
int main(){
	int min,max,factor;
	scanf("%d %d %d",&min,&max,&factor);
	int i;
	for(i=min;i<=max;i++){
		if(i%factor==0)
			printf("%d ",i);
		
	}
	return 0;
}

奇偶判断

/***
问题描述
  能被2整除的数称为偶数,不能被2整除的数称为奇数。给一个整数x,判断x是奇数还是偶数。
输入格式
  输入包括一个整数x,0<=x<=100000000。
输出格式
  如果x是奇数,则输出“odd”,如果是偶数,则输出“even”。
样例输入
10
样例输出
even
样例输入
2009
样例输出
odd
***/
#include
int main(){
	int n;
	scanf("%d",&n); 
	if(n%2==0)
		printf("even");
	else
		printf("odd");
	return 0;
} 

平方计算

/***
问题描述
  输入正整数a, m,输出a^2%m,其中^表示乘方,即a^2表示a的平方,%表示取余。
输入格式
  输入包含两个整数a, m,a不超过10000。
输出格式
  输出一个整数,即a^2%m的值。
样例输入
5 6
样例输出
1
***/
#include
int main(){
	int a,m;
	scanf("%d %d",&a,&m); 
	printf("%d",a*a%m); 
	return 0;
}

连接字符串

/***
 编程将两个字符串连接起来。例如country与side相连接成为countryside。
  输入两行,每行一个字符串(只包含小写字母,长度不超过100);输出一行一个字符串。
样例输入
country
side
样例输出
countryside
***/
#include
#include
#define N 200
int main(){
	char a[N],b[N];
	scanf("%s",&a);
	scanf("%s",&b);
	printf("%s",strcat(a,b));
	return 0;
} 

完数

/***
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6就是“完数”。又如,28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28也是“完数”。编写一个程序,判断用户输入的一个数是否为“完数”。
  输入格式:输入只有一行,即一个整数。
  输出格式:输出只有一行,如果该数为完数,输出yes,否则输出no。
  输入输出样例
样例输入
6
样例输出
yes
***/
#include
int main(){
	int n,i,sum=0;
	scanf("%d",&n);
	for(i = 1;i<n;i++){
		if(n%i==0){
			sum=sum+i;
		}
	}
	if(sum==n){
		printf("yes\n"); 
	} 
	else{
		printf("no\n"); 
	}
	return 0;
}

4-2找公倍数

/***
 这里写问题描述。
  打印出1-1000所有11和17的公倍数。
***/
#include
int main(){
	int i;
	for(i=1;i<=1000;i++){
		if(i%11==0&&i%17==0)
			printf("%d\n");
	}
	return 0; 
} 

6-2递归求二进制表示位数

/***
问题描述
  给定一个十进制整数,返回其对应的二进制数的位数。例如,输入十进制数9,其对应的二进制数是1001,因此位数是4。
样例输入
一个满足题目要求的输入范例。
9
***/
#include
int main(){
	int n;
	scanf("%d",&n);
	int i=0;
	while(n > 0){
		n/=2;
		i++;
	}
	printf("%d",i);
	return 0;
} 

sign函数

/***
问题描述
  给定实数x,输出sign(x)的值。

  sign(x)是符号函数,如果x>0,则返回1;如果x=0,则返回0;如果x<0,则返回-1。
输入格式
  一行一个实数x。
输出格式
  一行一个整数表示答案。
样例输入
-0.0001
样例输出
-1
***/
#include
int main(){
	double n;
	scanf("%lf",&n);
	if(n>0)
		printf("1");
	else if(n==0)
		printf("0");
	else
		printf("-1");
	return 0;
}

P0103

/***
从键盘输入一个大写字母,要求改用小写字母输出。
输入
  A
输出
  a
***/
#include
int main(){
	char n;
	scanf("%c",&n);
	printf("%c",n+32);
	return 0;
} 

大小写转换

/***
问题描述
  编写一个程序,输入一个字符串(长度不超过20),然后把这个字符串内的每一个字符进行大小写变换,即将大写字母变成小写,小写字母变成大写,然后把这个新的字符串输出。
  输入格式:输入一个字符串,而且这个字符串当中只包含英文字母,不包含其他类型的字符,也没有空格。
  输出格式:输出经过转换后的字符串。
输入输出样例
样例输入
AeDb
样例输出
aEdB
***/
#include
#include 
#define N 20
int main(){
	char num[N];
	int i;
	scanf("%s",&num);
	int len;
	len =strlen(num);
	for(i=0;i<len;i++){
		if(num[i]>='a'&&num[i]<='z')
			num[i]=num[i]-32;
		else
			num[i]=num[i]+32;
	}
	printf("%s",num);
	return 0;
} 

P0505

/***
一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。
阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;
而35!就更大了,它已经无法存放在一个浮点型变量中。
因此,当n比较大时,去计算n!是非常困难的。
幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。
例如,5!=1*2*3*4*5=120,因此5!最右边的那个非0的数字是2。
再如,7!=5040,因此7!最右边的那个非0的数字是4。
再如,15!= 1307674368000,因此15!最右边的那个非0的数字是8。
请编写一个程序,输入一个整数n(0
#include
int main(){
	int n;
	scanf("%d",&n); 
	int i;
	long long sum=1;
	for(i=1;i<=n;i++){
		sum = sum*i;
		while(sum%10==0){
			sum/=10;
		}
		sum=sum%1000;
	}
	printf("%lld",sum%10);
	return 0;
}

1的个数

/***
问题描述
  输入正整数n,判断从1到n之中,数字1一共要出现几次。例如1123这个数,则出现了两次1。例如15,那么从1到15之中,一共出现了8个1。
输入格式
  一个正整数n
输出格式
  一个整数,表示1出现的资料
样例输入
15
样例输出
8
数据规模和约定
  n不超过30000
***/
#include
int main(){
	int n;
	scanf("%d",&n);
	int i;
	int count = 0;
	for(i=1;i<=n;i++){
		int m=i;
		while(m!=0) {
			if(m%10==1)
			{
				count=count+1;
			}
			m/=10;	
		}	
	} 
	printf("%d",count);
	return 0;
}

大等于n的最小平方数

/***
问题描述
  输出大等于n的最小的完全平方数。
  若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数
  Tips:注意数据范围
输入格式
  一个整数n
输出格式
  大等于n的最小的完全平方数
样例输入
71711
样例输出
71824
数据规模和约定
  n是32位有符号整数
***/
#include
#include
int main(){
	int n;
	scanf("%d",&n);
	long long int root = ceil(sqrt(n));
	printf("%lld",root*root);
	return 0;
}

企业奖金发放

/***
企业发放的奖金根据利润提成。
利润低于或等于10万元时,奖金可提10%;
利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
20万到40万之间时,高于20万元的部分,可提成5%;
40万元到60万元之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%;
高于100万元时,超过100万元的部分按1%提成。
从键盘输入当月利润,求应发放奖金总数?(保留两位小数)利润的大小在double以内
样例输入
210000
样例输出
18000.00
***/
#include
int main(){
	double n;
	scanf("%lf",&n);
	double sum;
	if(n<=100000){
		sum=n*0.1;
		printf("%.2lf",sum);
	} 
	else if(n>100000&&n<200000){
		sum=100000*0.1+(n-100000)*0.075;
		printf("%.2lf",sum); 
	}
	else if(n>=200000&&n<400000){
		sum=100000*0.1+100000*0.075+(n-200000)*0.05;
		printf("%.2lf",sum);
	}
	else if(n>=400000&&n<600000){
		sum=100000*0.1+100000*0.075+200000*0.05+(n-400000)*0.03;
		printf("%.2lf",sum);
	}
	else if(n>=600000&&n<1000000){
		sum=100000*0.1+100000*0.075+200000*0.05+200000*0.03+(n-600000)*0.015;
		printf("%.2lf",sum);
	}
	else{
		sum=100000*0.1+100000*0.075+200000*0.05+200000*0.03+400000*0.015+(n-1000000)*0.01;
		printf("%.2lf",sum);
	}
	
	return 0;
} 

一元一次方程

/***
输入一元一次方法的ax+b=0的解。且数据均在double类型以内,且一定有解(保留2位小数)
样例输入
2 6
样例输出
-3.00
***/
#include
int main(){
	double a,b;
	scanf("%lf %lf",&a,&b);
	printf("%.2lf",(-b)/a);
	return 0;
} 

简单加法(基本型)

/***
问题描述
  首先给出简单加法算式的定义:
  如果有一个算式(i)+(i+1)+(i+2),(i>=0),在计算的过程中,没有任何一个数位出现了进位,
则称其为简单的加法算式。
  例如:i=3时,3+4+5=12,有一个进位,因此3+4+5不是一个简单的加法算式;
	又如i=112时,112+113+114=339,没有在任意数位上产生进位,
	故112+113+114是一个简单的加法算式。

  问题:给定一个正整数n,问当i大于等于0且小于n时,有多少个算式(i)+(i+1)+(i+2)是简单加法算式。其中n<10000。
输入格式
  一个整数,表示n
输出格式
  一个整数,表示简单加法算式的个数
样例输入
4

样例输出


3

***/
#include
int main(){
	int n;
	scanf("%d",&n);
	int count=0;
	int i;
	for(i=0;i<n;i++){
		int a,b,c,d;   //n<10000 
		a=i%10;
		b=i/10%10;
		c=i/100%10;
		d=i/1000;
		if(a<=2&&b<=2&&c<=2&&d<=2)//最大不能超过9 
			count++;
	}
	printf("%d",count);
	return 0;
}

3.算法提高

字符串顺序比较

/***
问题描述
  比较两个字符串s1和s2,输出:0表示s1与s2相等;1表示s1的字母序先于s2;-1表示s1的字母序后于s2
输入格式
  输入两行,第一行输入一个字符串1,第二行输入字符串2。
输出格式
  输出比较的结果
样例输入
abc
abd
样例输出
1
样例输入
English
English
样例输出
0
样例输入
hello
ha
样例输出
-1
***/

#include
#include
#define N 10000
int min(char num1[N],char num2[N]){
	return strlen(num1)>strlen(num2)?strlen(num2):strlen(num1); 
}
int main(){
	char num1[N];
	char num2[N];
	int i,k=0,p=0;
	scanf("%s",&num1);
	scanf("%s",&num2);
	
	if(strcmp(num1,num2)==0){
		printf("0");
	}
	else{
		for(i =0;i < min(num1,num2);i++)
		{
			if(num1[i]<=num2[i])
				k++;
				
			if(num1[i]>=num2[i])
				p++;
		}
	} 
	if(k==strlen(num1)||k==strlen(num2))
		printf("1");
	if(p==strlen(num1)||p==strlen(num2))
		printf("-1");
		
	return 0;
}
/***法二
#include
#include
int main(){
	char s1[100],s2[100];
	scanf("%s%s",s1,s2);
	int i;
	for(i=0;is2[i]){//s2先序输出-1直接退出程序 
			printf("-1");
			return 0;
		}
	}
	printf("0");//否则输出0 
	return 0;
}
 
***/

递归输出

/***
问题描述
  编写递归函数,将组成整数的所有数字逐个输出,每个数字后面加上一个减号“-”,
	例如对于整数123,该函数将输出1-2-3- 。编写主函数测试该递归函数。
输入格式
  输入一个整数n
输出格式
  如题目要求,把n的每个数字后面加一个减号”-“输出
样例输入
一个满足题目要求的输入范例。
例:
123
样例输出
与上面的样例输入对应的输出。
例:
1-2-3-
数据规模和约定
  输入n>0,必须使用递归调用来实现!
***/
#include
int digui(int n){
	if(n==0)
		return 0;
	digui(n/10);
	printf("%d-",n%10);
}
int main(){
	int n;
	scanf("%d",&n);
	digui(n);
	return 0;
} 

约数个数

/***
输入一个正整数N (1
样例输入
12
样例输出
6
样例说明
  12的约数包括:1,2,3,4,6,12。共6个  
***/
#include
int main(){
	int n;
	scanf("%d",&n);
	int i,count = 0;
	for(i = 1;i<=n;i++){
		if(n% i==0)
		{
			count++; 
		} 
		
	}
	printf("%d",count);
	return 0;
}

计数问题

/***
问题描述
  试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?
	例如,在 1到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,数字 1 出现了 4 次。
输入格式
  输入文件名为 count.in。
  输入共 1 行,包含 2 个整数 n、x,之间用一个空格隔开。
输出格式
  输出文件名为 count.out。
  输出共 1 行,包含一个整数,表示 x 出现的次数。
输入输出样例
count.in			count.out
11 1				4
数据说明
  对于 100%的数据,1≤ n ≤ 1,000,000,0 ≤ x ≤ 9。
***/

#include
int main(){
	int n,x;
	scanf("%d %d",&n,&x);
	int count =0;
	int i;
	int temp;
	for(i=1;i<=n;i++){
		temp =i;
		while(temp!=0){
			if(temp%10==x)
				count++;
			temp/=10;
		}
	
		
	}
	printf("%d",count);
	return 0;
}

利息计算

/***
编制程序完成下述任务:接受两个数,一个为用户一年期定期存款金额,一个为按照百分比格式表示的利率;程序计算一年期满
  后本金与利息总额。说明:(1)存款金额以人民币元为单位,可能精确到分;
	(2)输入利率时不需要输入百分号,例如一年期定期存款年利率
  为2.52%,用户输入2.52即可;
	(3)按照国家法律,存款利息所得需缴纳20% 的所得税,计算结果时所得税部分应扣除。要求输出小数点后严格
  保留两位小数。
样例输入
10000 2.52
样例输出
10201.60
***/
#include
int main(){
    double a,b,sum;
    scanf("%lf %lf",&a,&b);
	sum=a+(a*b*1*0.01*0.8);
    printf("%.2f\n",sum);
    return 0;
}

简单加法

/***
问题描述
  小于10的自然数中有四个数字能除尽3或5(3, 5, 6, 9),它们的和为23。
  请计算所有小于1000的自然数中能除尽3或5的数字的合。然后使用标准输出cout,输出你的结果。
输入格式
  无。
输出格式
  一行一个整数,表示你的结果。
***/
#include
int main(){
	int i;
	int sum=0;
	for(i=0;i<1000;i++){
		if(i%3==0||i%5==0){
			sum+=i;
	
		}
	}
	printf("%d",sum);	
	return 0;
} 

三个整数的排序

/***
问题描述
  ?输入三个数,比较其大小,并从大到小输出。
输入格式
  一行三个整数。
输出格式
  一行三个整数,从大到小排序。
样例输入
33 88 77
样例输出
88 77 33
***/
#include
int main(){
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	int max;
	if(a<b){
		max = a;
		a=b;
		b=max;
	}
	if(a<c)
	{
		max = a;
		a=c;
		c=max;
	}
		if(b<c){
		max = b;
		b=c;
		c=max;
	}
	printf("%d %d %d",a,b,c);
	return 0;
}

勾股数

/***
问题描述
  勾股数是一组三个自然数,a < b < c,以这三个数为三角形的三条边能够形成一个直角三角形
  输出所有a + b + c <= 1000的勾股数
  a小的先输出;a相同的,b小的先输出。
输出格式
  每行为一组勾股数,用空格隔开
样例输出
例如,结果的前三行应当是
3 4 5
5 12 13
6 8 10
***/
#include
int main(){
	int a,b,c;
	for(a=3;a<1000;a++)
	for(b=a;b<1000;b++)
	for(c=b;c<1000;c++)
	if(a*a+b*b==c*c&&a+b+c<=1000)
	printf("%d %d %d\n",a,b,c);
	return 0;
}

输入输出格式练习

/***
问题描述
  按格式格式读入一个3位的整数、一个实数、一个字符 。
  并按格式输出 一个整数占8位左对齐、一个实数占8位右对齐、一个字符 ,并用|隔开。
输入格式
  见题面
输出格式
  见题面
样例输入
123456.789|a
样例输出
123 | 456.8|a
***/
#include
int main(){
	int a;
	double b;
	char c;
	scanf("%3d%lf|%c",&a,&b,&c);
	printf("%-8d|%8.1f|%c\n",a,b,c);
	return 0;
} 

征税程序

/***
问题描述
  税务局希望你帮他们编写一个征税程序,该程序的功能是:首先输入某公司的年销售额sale和税率rate,然后程序将计算出相应的税额tax,并把它显示在屏幕上。计算公式是:
  tax = sale * rate。
  输入格式:输入只有一行,包括两个数据,即年销售额和税率。
  输出格式:输出只有一行,包括一个实数,即相应的税额,保留到小数点后两位。
  输入输出样例
样例输入
50000.5 0.1
样例输出
5000.50
***/
#include
int main(){
	double a,b;
	scanf("%lf %lf",&a,&b);
	double n;
	n=a*b;
	printf("%.2lf",n);
	return 0;
} 

算术运算

/***
编写一程序,接受用户输入的两个整数,并计算它们的和、差、
积、商,程序运行时候输入输出例子如下所示。
样例输入:
3  5
样例输出:
3+5=8
3-5=-2
3*5=15
3/5=0
注意:输出要严格按照+-/的顺序,分四行输出,而且中间不能有空格,否则系统会判为错误。
***/
#include
int main(){
	int a,b;
	scanf("%d %d",&a,&b);
	printf("%d+%d=%d\n",a,b,a+b);
	printf("%d-%d=%d\n",a,b,a-b);
	printf("%d*%d=%d\n",a,b,a*b);
	printf("%d/%d=%d\n",a,b,a/b);
	return 0;
}

填充蛋糕

/***
编程计算涂满高为2,半径为r的圆形蛋糕表面,需要多少表面积的奶油(只要涂上表面和侧面)
  读入一个数r,输出需要奶油的表面积,结果保留一位小数
样例输入
5.0
样例输出
141.4
***/
#include
#define PI 3.1415926 
int main(){
	double r;
	scanf("%lf",&r);
	printf("%.1lf",4*r*PI+PI*r*r); 
	return 0;
} 

数的运算

/***
输入一个正整数(范围[1..10000]),打印其平方(不保留小数位)、uu                                                     平方根、倒数。(用指针实现,保留2位小数,输出每个数之间以一个空格隔开)
样例输入
2
样例输出
4 1.41 0.50
***/
#include
#include
int main(){
	int n;
	scanf("%d",&n);
	int *m=&n;
	printf("%d ",(*m)*(*m));
	printf("%.2lf ",sqrt(*m));
	printf("%.2lf",1.0/(*m));
	return 0;
} 

统计平均成绩

/***
有4个学生,上4门课,要求输入全部学生的各门课成绩,并分别求出每门课的平均成绩。(保留2位小数)
  括号里是解释内容,不用输入输出。输入的所有数都为0到100之间(包括端点)的整数
样例输入
(输入第1个学生的4门课成绩) 94 78 87 96
(输入第2个学生的4门课成绩) 66 87 75 69
(输入第3个学生的4门课成绩)100 98 89 77
(输入第4个学生的4门课成绩) 82 73 67 54
样例输出
(第1门课的平均成绩是) 85.50
(第2门课的平均成绩是) 84.00
(第3门课的平均成绩是) 79.50
(第4门课的平均成绩是) 74.00
***/
#include
#define N 4
int main(){
	double num[N][N]; 
	int i,j;
	for(i =0;i<N;i++){
		for(j = 0;j<N;j++){
			scanf("%lf",&num[i][j]);
		}
	}
	for(i=0;i<N;i++){
		printf("%.2lf\n",(num[0][i]+num[1][i]+num[2][i]+num[3][i])/4.0); 
	}
	return 0;
}

时间转化

/***
输入n分钟换算成天、小时和分输出。例如4880分钟,可换算成3天9小时20分。
  输入一个正整数n(1
样例输入
4880
样例输出
3 9 20
***/
#include
int main(){
	int n;
	scanf("%d",&n);
	int day=n/1440;//天数
	int h = n%1440/60;
	int m=n%1440%60;
	printf("%d %d %d",day,h,m);
	return 0;
}

选最大数

/***
输入3个整数a、b、c,(数的范围是[1,10000])输出其中最大的数。(用指针实现)
样例输入
2 5 1
样例输出
5
***/
#include
int main(){
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	int *max;
	if(a>b&&a>c)
		max = &a;
	if(b>a&&b>c)
		max = &b;
	if(c>a&&c>b)
		max = &c;
	printf("%d\n",*max); 
	
	return 0;
} 

温度转换

/***
 编写一个C程序,输入一个整数摄氏温度,输出相应的华氏温度。在输出时,保留小数点后面两位。
样例输入
0
样例输出
32.00
***/
#include
int main(){
	double n;
	scanf("%lf",&n);
	double sum=n*1.8+32;
	printf("%.2lf",sum);
	return 0;
} 

Quadratic Equation(解方程)

/***
问题描述
  求解方程ax2+bx+c=0的根。要求a, b, c由用户输入,并且可以为任意实数。
  输入格式:输入只有一行,包括三个系数,之间用空格格开。
  输出格式:输出只有一行,包括两个根,大根在前,小根在后,无需考虑特殊情况,保留小数点后两位。
  输入输出样例
样例输入
2.5 7.5 1.0
样例输出
-0.14 -2.86
***/
#include
#include
int main(){
	double a,b,c;
	scanf("%lf %lf %lf",&a,&b,&c);
	double x=((-b)+sqrt(b*b-4*a*c))/(2*a);
	double y=((-b)-sqrt(b*b-4*a*c))/(2*a);
	if(x>y){
		printf("%.2lf %.2lf",x,y);
	}
	else{
		printf("%.2lf %.2lf",y,x);
	}
	return 0;
}

c++_ch02_02(switch语句)

/***
使用Switch语句编写一个模拟简单计算器的程序。
依次输入两个整数和一个字符,并用空格隔开。
如果该字符是一个“+”,则打印和;
如果该字符是一个“-”,则打印差;
如果该字符是一个“*”,则打印积;
如果该字符是“/”,则打印商;
如果该字符是一个“%”,则打印余数。
打印结果后输出一个空行。
***/
#include
int main(){
	int a,b;
	char c;
	scanf("%d %d %c",&a,&b,&c);
	switch(c){
		case'+':
			printf("%d\n",a+b);break;
		case'-':
			printf("%d\n",a-b);break;
		case'*':
			printf("%d\n",a*b);break;
		case'/':
			printf("%d\n",a/b);break;
		case'%':
			printf("%d\n",a%b);break;
	}
	return 0;
}

c++_ch02_03(石头剪刀布)

/***
写程序实现“剪刀,石头,布”游戏。
在这个游戏中,两个人同时说“剪刀”,“石头”或“布”,
压过另一方的为胜者。规则是:“布”胜过“石头”,
“石头”胜过“剪刀”,“剪刀”胜过“布”。
要求:选择结构中使用枚举类型,结果的输出也使用枚举类型表示。
  输入:两个数,范围为{0,1,2},用空格隔开。
 0表示石头,1表示布,2表示剪刀。这两个数分别表示两个人所说的物品。
  输出:如果前者赢,输出1。如果后者赢,输出-1。如果是平局,输出0。
***/
#include
int main(){
	int a,b;
	scanf("%d %d",&a,&b);
	if(a==b){
		printf("0");
	}
	else{
		if(a==0){
			if(b==1)
				printf("-1");
			if(b==2)
				printf("1");
		}
		if(a==1){
			if(b==0)
				printf("1");
			if(b==2)
				printf("-1");
		}
		if(a==2){
			if(b==0)
				printf("-1");
			if(b==1)
				printf("1");
		}
	}
	return 0;
}

3-2字符串输入输出函数

/***
编写函数GetReal和GetString,在main函数中分别调用这两个函数。在读入一个实数和一个字符串后,将读入的结果依次用printf输出。
  两次输入前要输出的提示信息分别是"please input a number:\n”和"please input a string:\n"
样例输入
9.56
hello
样例输出
please input a number:
please input a string:
9.56
hello
***/
#include
double GetReal(){
	double n;
	scanf("%lf",&n);
	return n;	
}
void GetString(char a[]){
	getchar();
	gets(a);
}
int main(){
	double n;
	char a[1000];
	printf("please input a number:\n");
	n=GetReal();
	printf("please input a string:\n");
	GetString(a);
	printf("%.2lf\n",n);
	puts(a);
	return 0;
} 

c++_ch02_04

/***
问题描述
  输出1~100间的质数并显示出来。注意1不是质数。
输出格式
  每行输出一个质数。
  2
  3
  ...
  97
***/
#include
int main(){
	int i;
	for(i=2;i<=100;i++){
		int j,sum=0;
		for(j=1;j<i;j++){
			if(i%j==0)
			{
				sum++;
			}
		}
		if(sum==1){
			printf("%d\n",i);
		}
	}
	return 0;
}

3-1课后习题2(求和)

/***
问题描述
  编写一个程序,接受用户输入的10个整数,输出它们的和。
输出格式
  要求用户的输出满足的格式。
  例:输出1行,包含一个整数,表示所有元素的和。
样例输入
1 2 3 4 5 6 7 8 9 10
样例输出
55
数据规模和约定
  输入数据中每一个数的范围。
  例:输入数<100000。
***/
#include
#define N 10
int main(){
	int a[N];
	int i,sum=0;
	for(i=0;i<N;i++){
		scanf("%d",&a[i]);
	}
	for(i=0;i<N;i++){
		sum=sum+a[i];
	}
	printf("%d",sum);
	return 0;
}
/***法二
#include 
int main()
{
	int a=10;
	int sum=0;
	while(a-->0)
	{
		int n;
		scanf("%d",&n);
		sum+=n;
	}
	printf("%d\n",sum);
    return 0;
}
***/

P0104(1的位数)

/***
输入一个无符号整数x,输出x的二进制表示中1的个数.
输入:
  76584
输出:
  7
***/
#include
int main(){
	unsigned int x;
	scanf("%d",&x);
	int count =0;
	while(x){
		if(x&1)//位与运算 
			count++;
		x>>=1;//右移判断是否为1 
	}
	printf("%d\n",count);
	return 0;
}

p0402(猴子吃桃问题)

/***
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第十天早上想在吃时就只剩下一个桃子了。
求第一天共摘了多少桃子。
  (下面的不是正确答案)
输出:
  8
***/
#include
int main(){
	int n=1,i;
	for(i=0;i<9;i++)
		n=(n+1)*2;
	printf("%d",n);
	return 0;
} 

c++_ch02_01(ascii码)

/***
编写一个程序,利用强制类型转换打印元音字母大小写10种形式的ASCII码。
  输出的顺序为:大写的字母A,E,I,O,U的ASCII码,小写的字母a,e,i,o,u的ASCII码。
所有的ASCII码都用十进制表示.输出10行,每行一个ASCII码,最后输出一个空行。
***/
#include
#define N 10
int main(){
	char a[10]={'A','E','I','O','U','a','e','i','o','u'};
	int i;
	for(i=0;i<10;i++){
		printf("%d\n",(int)a[i]);
	}
	printf("\n");
	return 0;
}

7-1用宏求球的体积

/***
问题描述
  使用宏实现计算球体体积的功能。用户输入半径,系统输出体积。不能使用函数,pi=3.1415926,结果精确到小数点后五位。
样例输入
一个满足题目要求的输入范例。
例:
1.0
样例输出
与上面的样例输入对应的输出。
例:

数据规模和约定
  输入数据中每一个数的范围。
  数据表示采用double类型。
***/
#include
#define pi 3.1415926
int main(){
	double r;
	scanf("%lf",&r);
	double area=(4*pi*r*r*r)/3; 
	printf("%.5lf",area);
	return 0;
}

7-2求arccos值

/***
问题描述
  利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[-1, 1],
返回值为[0, PI]。要求结果准确到小数点后5位。(PI = 3.1415926)
  提示:要达到这种程度的精度需要使用double类型。
样例输入
0.5
样例输出

数据规模和约定
  -1 <= x <= 1, 0 <= arccos(x) <= PI。
***/
#include
#include
int main(){
	double x;
	scanf("%lf",&x);
	printf("%0.5lf",acos(x));
	return 0;
}

p0101

/***
一个水分子的质量是3.0*10-23克,一夸脱水的质量是950克。写一个程序输入水的夸脱数n(0 <= n <= 1e10),然后输出水分子的总数。
输入
  109.43
输出
  3.465283E+027
***/
#include
int main(){
	double n;
	scanf("%lf",&n);
	double s=3E-23/950;
	double sum =n/s;
	printf("%E",sum);
	return 0;
}

JOE的算数

/***
问题描述
  有一天,JOE终于不能忍受计算a^b%c这种平凡的运算了。
	所以他决定要求你写一个程序,计算a^b%c。

  提示:若b为奇数,,a^b=(a^(b/2))^2*a,否则a^b=(a^(b/2))^2。
输入格式
  三个非负整数a,b,c;
输出格式
  一个整数ans,表示a^b%c;
样例输入
7 2 5
样例输出
4
数据规模和约定
  30% a <= 100, b <= 10^4, 1 <= c <= 100
  60% a <=10^4, b <= 10^5, 1 <= c <= 10^4
  100% a <=10^6, b <= 10^9, 1 <= c <= 10^6
***/
#include
int main(){
	long long int a,b,c;
	scanf("%lld %lld %lld",&a,&b,&c);
	a=a%c;
	long long int sum = 1; 
	while(b){
		if(b%2==1)//b为奇数
			sum=(sum*a)%c;
		b/=2;
		a=(a*a)%c; 
	}
	printf("%lld",sum);
	return 0;
}

求最大公约数

/***
编写一函数gcd,求两个正整数的最大公约数。
样例输入: 
5 15
样例输出:
5
样例输入: 
7 2
样例输出:
1
***/
#include
int main(){
	int m,n;
	scanf("%d %d",&m,&n); 
	int s; 
	while((s=m%n)!=0){
		m=n;
		n=s;
	} 
	printf("%d\n",n);
	return 0;
}

Hankson 的趣味题(最大公约数最小公倍数)

/***
问题描述
  Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson。现 在,刚刚放学回家的Hankson 正在思考一个有趣的问题。 今天在课堂上,老师讲解了如何求两个正整数c1 和c2 的最大公约数和最小公倍数。现 在Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公 倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整 数x 满足: 1. x 和a0 的最大公约数是a1; 2. x 和b0 的最小公倍数是b1。 Hankson 的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的 x 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x 的个数。请你帮 助他编程求解这个问题。
输入格式
  输入第一行为一个正整数n,表示有n 组输入数据。

  接下来的n 行每 行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入 数据保证a0 能被a1 整除,b1 能被b0 整除。
输出格式
  输出共n 行。每组输入数据的输出结果占一行,为一个整数。
  对于每组数据:若不存在这样的 x,请输出0; 若存在这样的 x,请输出满足条件的x 的个数;
样例输入
2
41 1 96 288
95 1 37 1776
样例输出
6
2
样例说明
  第一组输入数据,x 可以是9、18、36、72、144、288,共有6 个。
  第二组输入数据,x 可以是48、1776,共有2 个。
数据规模和约定
  对于 50%的数据,保证有1≤a0,a1,b0,b1≤10000 且n≤100。
  对于 100%的数据,保证有1≤a0,a1,b0,b1≤2,000,000,000 且n≤2000。
思路:由题意知x的范围在1~b1之间,所以可以从1~b1进行枚举,如果gcd(x,a0)==a1且lcm(x,b0)==b1就cnt++ 
	  for(x=0;x<=b1;x++){
		if((gcd(x,a0)==a1)&&(lcm(x,b0)==b1)){
			cnt++;
		}
	}
	这样会超时。
	因为a1是x,a0的最大公因数,b1是x,b0的最小公倍数
	所以满足条件的x一定是b1的因数,a1的倍数
	所以仅需枚举b1的因数:当得到b1的一个因数时,它的另一个因数也就确定了,所以只需枚举到sqrt(b1)即可
	需要注意数据的范围 
***/



#include
long long int gcd(long long int a,long long int b){//最大公约数 
	return b==0?a:gcd(b,a%b);
}
long long int lcm(long long int a,long long int b){//最小公倍数 
	return a*b/gcd(a,b); //a*b/最大公约数 
}
int main(){
	int n,count;
	long long int a0,a1,b0,b1,x;
	scanf("%d",&n); 
	while(n--){
		count=0;
		scanf("%lld%lld%lld%lld",&a0,&a1,&b0,&b1);
		for(x=1;x*x<=b1;x++){  //x在1~sqrt(b1)间枚举 
			if(b1%x==0){
				if((gcd(x,a0)==a1)&&(lcm(x,b0)==b1)){
					count++;
				}
				if((b1/x!=x)&&(gcd(b1/x,a0)==a1)&&(lcm(b1/x,b0)==b1)){
					count++;
				}
				
			}
		}
		printf("%d\n",count);
	}
	return 0;
} 

你可能感兴趣的:(蓝桥杯真题,c语言,算法)