2.编写程序求出满足下列条件的四位数:
(1)该数是个完全平方数;
(2)千位、十位数字之和为10且百位、个位数字之积为12。
要求每一行显示5个数,并且统计满足条件的数字个数。
下面是我的代码:
#include
#include
int main()
{
int m,n,qw,bw,sw,gw,sum=0;
for(m=1000;m<=9999;m++)
{
for(n=32;n<=99;n++)
{
if(m==n*n)
break;
else
continue;
}
if(n<100)
{
qw=m/1000;
bw=(m%1000)/100;
sw=(m%100)/10;
gw=m%10;
if(qw+sw==10&&bw+gw==12)
{
printf("%6d",m);
sum+=1;
if(sum%5==0)
printf("\n");
}
}
else
continue;
}
printf("\n");
printf("满足条件的数字个数有%d",sum);
return 0;
}
运行结果是:满足条件的数字个数有0,当然这是错误的,求在行的同志们帮帮忙!
突然发现是因为百位和个位题目要求乘起来是12,不是加,好尴尬。然后运行成功了!但是有个问题,就是我这种方法运行很慢,请问有没有运行起来比较快的更好的算法呢?
头文件没有复制好,这个请跳过。
设这个数是DCBA,它是完全平方数,设它的根 为 dcba ,(个位数) a可以是 0~9,因为A和百位数之积为12,A为1~9,也就是说,A只能1、4、5、6、9。
所以百位和个位只存在 两组情况 {C= 3 , A = 4} 、{C=2,A=6};
而千位和十位只存在9种情况(D,C)= (1,9)、(2,8)、(3,7)、(4,6)、(5,5)、(6,4)、(7,3)、(8,2)、(9,1)
一共才2*9 = 18种情况,直接穷举,会很快。
//2.编写程序求出满足下列条件的四位数:
//(1)该数是个完全平方数;
//(2)千位、十位数字之和为10且百位、个位数字之积为12。
//要求每一行显示5个数,并且统计满足条件的数字个数。
/*
设这个数是DCBA,它是完全平方数,设它的根 为 dcba ,(个位数) a可以是 0~9,因为A和百位数之积为12,A为1~9,也就是说,A只能1、4、5、6、9。
所以百位和个位只存在 两组情况 {C= 3 , A = 4} 、{C=2,A=6};
而千位和十位只存在9种情况(D,B)= (1,9)、(2,8)、(3,7)、(4,6)、(5,5)、(6,4)、(7,3)、(8,2)、(9,1)
一共才2*9 = 18种情况,直接穷举,会很快。
Num[18] = {1394,2384,3374,4364,5354,6344,7334,8324,9314,1296,2286,3276,4266,5256,6246,7236,8226,9216};
*/
//#include <stdafx.h>
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
int Num[18] = {1394,2384,3374,4364,5354,6344,7334,8324,9314,1296,2286,3276,4266,5256,6246,7236,8226,9216};
int main()
{
int i = 0,count = 0;
double x = 0;
for (i=0;i<18;i++)
{
x = sqrt(Num[i]);//开平方求根
if(x == (int)x)//判断是否是完全开尽
{
count++;
if(count % 5 == 0)
{
printf("\n");
}
printf("%d,",Num[i]);
}
}
printf("\n count = %d",count);
getchar();
return 0;
}
楼主,by the way,把一些大数定义成在main 函数外面,不会占用运行时间,只占编译时间。
处理大的菲波那切数列时,可以先私下运行出一万个、两万个数之后的值,输出到文本中,然后把这些值copy下来再定义在mian 函数外,需要的时候直接去取,省去很多计算,程序会加快很多。这是一种小窍门吧。如果你是在校生,鼓励你多参加编程,参加ACM,对以后会有很大好处。
你好。我具体来解释一下。设这个数是DCBA,它是完全平方数,设它的根 为 dcba (d、c、有可能为0)。
DCBA是完全平方数,A可能的值,是由a决定。a可以是 0~9. 0*0 =0A 只能是由 a*a 得到,对吧。
A 只能是由 a*a 得到,对吧。
0*0=0;
1*1=1;
2*2=4;
3*3=9;
4*4=16 个位数也是6
5*5=25 个位数也是5
6*6=36 个位数也是6
7*7=49 个位数也是9
8*8=64 个位数也是4
9*9=81 个位数也是1
总结下来,个位数只能是 0、1、4、5、6、9.
所以尾数是2、3的情况不存在。
其实,你也可以把你说的 36种写上,试试,不是吗?
我举个栗子吧,你知道斐波那契数列数列吗?它是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。OK,那咱们继续。请编写一个程序,程序会先输入一个值n,请输出F(n).
程序输入n;
程序输出 F(n);
(n>=2,n∈N* , n∈(2,30000))
示例:
输入 : 2
输出 : 2
示例2:
输入 : 6
输出 : 13
这道题是一个很基础的题,我先不说解法,你自己试试自己的思路,写好之后,看看能不能优化。
没关系,想想解决方案。输出不一定要用 long 啊!Long(长整型)变量存储为 32 位(4 个字节)有符号的数值形式,其范围从 -2,147,483,648 到 2,147,483,647,也就是-2^16 ~ 2^16-1. 菲波那切数列很快就会超了这个范围。先不要想着效率,先解决第一个问题,破开溢出的问题。想一想,那些输出是范围最大的?
嗯嗯,你很聪明嘛!而且一定也下功夫思考了!
不过,double 也不合适 ~ 你再考虑考虑。
C 中 double -1.7*10^-308~1.7*10^308
long double -1.2*10^-4932~1.2*10^4932
也就是说,最多支持4932位的数。斐波那契 数列的增长速度近乎指数级,过万,就会超过4932位了。你想一想,是不是这样?
给你两个小提示:
1.不要把思维局限在 long 、double 这些数值型输出,这仅是输出格式而已,最终体现出来都是一样。
2.你需要自己造轮子,制作小工具。
你好,楼主,我太想当然了。我试了一下,2^10 约 等于 10^3,也就是说,斐波那契数列第1000位约有300 位数。
10000位大概有3000位数。
long double 也是只能支持 第 23600 位斐波那契。你再考虑考虑~
突然发现是因为百位和个位题目要求乘起来是12,不是加,好尴尬。然后运行成功了!但是有个问题,就是我这种方法运行很慢,请问有没有运行起来比较快的更好的算法呢?