计算两个正整数得最大公约数和最公倍数
#include<stdio.h>
int gcd(int a,int b) //最大公约数
{
int min;
if(a<=0||b<=0) //是负数就退出程序
return -1;
if(a>b)
min=b; //将a,b中较小的赋值给min
else
min=a;
while(min){
if(a%min==0&&b%min==0) //判断是否是公约数
return min; //找到最大公约数返回此值
min--; //不是最大公约数,缩小min
}
return -1;
}
int lcm(int a,int b) //最小公倍数
{
int max;
if(a<=0||b<=0) //是负数就退出程序
return -1;
if(a>b) //将a,b中较大的赋值给max
max=a;
else
max=b;
while(max){
if(max%a==0&&max%b==0) //判断是否是公倍数
return max; //找到最小公倍数数返回此值
max++;
}
return -1;
}
int main()
{
int a,b;
printf("请输入两个正整数可以得到最大公约数和最小公倍数\n");
scanf("%d%d",&a,&b);
printf("\n%d和%d的最大公约数是:%d",a,b,gcd(a,b));
printf("\n%d和%d的最小公倍数是:%d\n",a,b,lcm(a,b));
return 0;
}
哥德巴赫猜想的近似证明
#include <string.h>
#include <stdio.h>
int isGoldbach(int a);
int TestifyGB_Guess(int low,int high);
int isPrime(int i);
void main()
{
/*验证1~100以内的歌德巴赫猜想*/
printf("\n验证1~100以内的歌德巴赫猜想\n");
if(TestifyGB_Guess(1,100))
printf("\n1~100以内的歌德巴赫猜想是正确的\n");
else printf("\n歌德巴赫猜想是错误的\n");
getchar();
}
int TestifyGB_Guess (int low,int high)
{/*在low和high的范围内验证歌德巴赫猜想*/
int i,j=0;
int flag=0;
for(i=low;i<=high;i++)
if(i%2==0&&i>2)
if(isGoldbach(i)){ /*偶数i符合歌德巴赫猜想*/
j++; /*j用来控制输出格式*/
if(j==5){
printf("\n");
j=0;
}
}
else
{flag=1;break;}
if(flag==0)
return 1; /*在low和high的范围内歌德巴赫猜想正确返回1*/
else
return 0; /*在low和high的范围内歌德巴赫猜想不正确返回0*/
}
int isGoldbach(int a)
{/*判断偶数a是否符合歌德巴和猜想*/
int i,flag=0;
for(i=1;i<=a/2;i++)
{
if(isPrime(i)&& isPrime(a-i))
/*如果i和a-i都为素数,则符合歌氏猜想*/
{
flag=1;
printf("%d=%d+%d ",a,i,a-i);
break;
}
}
if(flag==1)
return 1; /*a符合歌德巴赫猜想返回1*/
else
return 0; /*a不符合歌德巴赫猜想返回0*/
}
int isPrime(int i)
{/*判断o是否是素数*/
int n,flag=1;
if(1==i)flag=0; /*1不是素数,素数都要大于1*/
for(n=2;n<i;n++)
if(i%n==0){flag=0;break;}
/*如果在2~i-1之间i有其他因子,则i不是素数,flag置0*/
if(flag==1)
return 1; /*i是素数返回1*/
else
return 0; /*i不是素返回0*/
}
有红,黄,绿三种颜色的球,其中红球3个,黄球3个,绿球6个。现在将这12个球混
放在一个盒子中,从中任意摸出8个球,编程计算摸出球的各种颜色搭配
#include<stdio.h>
void main()
{
int red,yellow,green;
printf("红球\t黄球\t绿球\t\n");
for(red=0;red<=3;red++){
for(yellow=0;yellow<=3;yellow++){
for(green=2;green<=6;green++){
if(red+yellow+green==8){
printf(" %d\t %d\t %d\t\n",red,yellow,green);
}
}
}
}
}
百钱买百鸡
#include<stdio.h>
void main()
{
int i,j,k;
printf("百钱买百鸡的方法列表:\n");
for(i=0;i<=100;i++){
for(j=0;j<=100;j++){
for(k=0;k<=100;k++){
if(5*i+3*j+k/3==100&&k%3==0&&i+j+k==100){
printf("公鸡:%d\t母鸡:%d\t小鸡:%d\t\n",i,j,k);
}
}
}
}
}
完全数
#include<stdio.h>
void main()
{
long p[300]; //保存分解的因子
long i,num,count,s,c=0;
for(num=2;num<=2000000;num++){
count=0;
s=num;
for(i=1;i<num/2+1;i++){ //循环处理每一个数
if(num%i==0){ //能被i整除
p[count++]=i; //保存因子,计数器count增加1
s-=i; //减去一个因子
}
}
if(s==0){
printf("%4ld是完全数,因子是",num);
printf(" %ld=%ld",num,p[0]); //输出完全数
for(i=1;i<count;i++){ //输出因子
printf("+%ld",p[i]);
}
printf("\n");
c++;
}
}
getchar();
}
亲密数
如果整数A的全部因子之和等于B,此处的因子包括1,但是不包括A本身,并且整数B的全部因子(包括1,不包括本身)之和等于A,则将整数A和B称为亲密数
按照亲密数的定义,想要判断数a是否有亲密数,需要先计算出a的全部因子的累加和为b,然后再计算b的全部因子的累加和为n。如果n等于a,则可以判定a和b是亲密数。
计算数a的各因子算法如下:
用a依次对i(i=1~a/2)进行模运算,如果模运算结果等于0,则i为a 的一个因子;否则i就不是a 的因子
#include<stdio.h>
void main()
{
int i,a,b1,b2,m,g1[100],g2[100],count;
printf("输入最大范围:");
scanf("%d",&m);
for(a=1;a<m;a++){ //循环次数
for(i=0;i<100;i++){
g1[i]=g2[i]=0; //清空数组
}
count=0; //数组下标
b1=0; //累加求和
for(i=1;i<a/2+1;i++){ //求数a的因子
if(a%i==0){ //a能被i整除
g1[count++]=i; //保存因子到数组
b1+=i; //累加因子之和
}
}
count=0;
b2=0;
for(i=1;i<b1/2+1;i++){ //将数a因子之和再进行因子分解
if(b1%i==0){ //b1能被i整除
g2[count++]=i; //保存因子到数组
b2=b2+i; //累加因子之和
}
}
if(b2==a&&a<b1){ //判断A,B的输出条件
printf("\n\n%d和%d是亲密数,各因子为:",a,b1); //输出亲密数
printf("\n%d=1",a);
count=1;
while(g1[count]>0){ //输出一个数的因子
printf("+%d",g1[count]);
count++;
}
printf("\n%d=1",b1);
count=1;
while(g2[count]>0){ //输出另一个数的因子
printf("+%d",g2[count]);
count++;
}
}
}
printf("\n");
}
水仙花数
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k,c;
printf("100~999的水仙花数:\n");
for(c=100;c<=999;c++){
i=c/100; //分解百位数
j=(c-i*100)/10; //分解十位数
k=c%10; //分解个位数
if(pow(i,3)+pow(j,3)+pow(k,3)==c){
printf("%d ",c);
}
}
getchar();
return 0;
}
自守数
如果某个数的平方末尾几位数等于这个数,那么久称这个数为自守数。例如5和6是一位自守数(5*5=25 6*6=36),25*25=625 76*76=5776 ,所以25和76是自守数
自守数还有一个规律比如:
5+6=11=10¹+1
25+76=101=10²+1
625+376=1001=10³+1
所以两个n位自守数之和等于10的n次方+1
#include<stdio.h>
int main()
{
long faciend,num,mod,n_mod,p_mod;
//mod被乘数的系数,n_mod乘数的系数,p_mod部分乘积的系数
long i,t,n; //临时变量
printf("设置最大数:");
scanf("%ld",&num);
printf("1~%ld之间有以下自守数:\n",num);
for(i=1;i<num;i++){
faciend=i; //被乘数
mod=1;
do{
mod*=10; //被乘数的系数
faciend/=10;
}while(faciend>0); //循环求出被乘的系数
p_mod=mod; //p_mod为截取部分积时的系数
faciend=0; //积的最后N位
n_mod=10; //为截取乘数相应位时的系数
while(mod>0){
t=i%(mod*10); //获取被乘数
n=i%n_mod-i%(n_mod/10); //分解出每一位乘数作为乘数
t=t*n; //相乘结果
faciend=(faciend+t)%p_mod; //截取乘积的后面几位
mod/=10; //调整被乘数的系数
n_mod*=10; //调整乘数的系数
}
if(i==faciend){ //若为自守数,则输出
printf("%ld ",i);
}
}
printf("\n");
return 0;
}
素数
#include<stdio.h>
#define MAXNUM 1000 //寻找素数的范围
int PrimeNum(int i) //判断是否是素数
{
int j,flag=1;
for(j=2;j<i-1;j++){ //循环整除每一个数
if(i%j==0){ //i能被j整除,表示不是质数
flag=0;
break;
}
}
return flag;
}
int main()
{
int i,j,c=0;
int prime[MAXNUM+1]; //保存素数
for(i=2;i<=MAXNUM;i++){ //初始化数组
prime[i]=1; //标志位1表示对应的数是质数
}
for(i=3;i<=MAXNUM;i++){ //循环计算各数
prime[i]=PrimeNum(i); //计算数i是否为素数
}
printf("以下是2~%d之间的素数:\n",MAXNUM);
for(i=2;i<MAXNUM;i++){ //输出质数
if(prime[i]==1){ //若是质数
printf("%4d ",i); //输出质数
c++;
if(c%10==0){ //每行10个数据
printf("\n");
}
}
}
printf("\n");
return 0;
}