急,急,急!!!C++课程实践设计。本人菜鸟都不是。拜请请专业高人解答。完成后再加50分
题目:100!的末尾有多少个零由于计算机所能表示的整数范围有限,不可能用求出100!之后再数其尾数有多少个零的方法。必须从数学上分析100!末尾出产生零的条件。不难看出:...
题目:100!的末尾有多少个零
由于计算机所能表示的整数范围有限,不可能用求出100!之后再数其尾数有多少个零的方法。必须从数学上分析100!末尾出产生零的条件。不难看出:一个整数若含有一个5的因子则必然会在求100!时产生一个零。因此原问题转换为求1到100这100个整数中包含了多少5的因子。
环境:VC2005。
要求:写出设计过程、需求分析、设计结构(包括总体结构和数据结构)、实验中出错信息及处理方法及解决错误的方法、指出实验结果运行的操作系统和平台,运行结果。
做好后请发邮箱493243342@qq.com,拜谢 展开
由于计算机所能表示的整数范围有限,不可能用求出100!之后再数其尾数有多少个零的方法。必须从数学上分析100!末尾出产生零的条件。不难看出:一个整数若含有一个5的因子则必然会在求100!时产生一个零。因此原问题转换为求1到100这100个整数中包含了多少5的因子。
环境:VC2005。
要求:写出设计过程、需求分析、设计结构(包括总体结构和数据结构)、实验中出错信息及处理方法及解决错误的方法、指出实验结果运行的操作系统和平台,运行结果。
做好后请发邮箱493243342@qq.com,拜谢 展开
3个回答
展开全部
思路是这样子的:首先末尾要产生0,每产生一个0,都意味着存在一个10,因为他们是10进制的,那么10可以分解为5*2,由于每两个相邻的整数当中,就有一个因子2存在,也就是说,因子2的个数要比因子5的个数多的多……因此,本程序中,主要就是求因子5的个数。
求解的思路很简单,首先,我们取一个5的倍数且不大于待求数(题中为100)的数,求它分解出因子5的个数,之后将这个数递减5,重复上个步骤,直到将这个数递减到0,然后将以上所得到的因子数相加即得到结果。
另外一种思路就是:首先求出不大于待求数并且为5的倍数的自然数的个数,求出不大于待求数并且为25的倍数的自然数的个数,求出不大于待求数并且为125的倍数的自然数的个数……
然后将他们相加起来,当然还要扣掉重叠的部分……
这里,把第一种解法的程序写出来给你:
#include<iostream.h>
int main()
{
int n;
cout<<"Please input a number:";
cin >> n;
int factor5_count = 0;
while (n % 5 != 0)
{
n --;
}
while (n > 0)
{
int tmp = n;
while (tmp % 5 == 0)
{
factor5_count ++;
tmp /= 5;
}
n -= 5;
}
cout << factor5_count << endl;
return 0;
}
至于你说的 写出设计过程、需求分析、设计结构(包括总体结构和数据结构)、实验中出错信息及处理方法及解决错误的方法、指出实验结果运行的操作系统和平台,运行结果。
呵呵。。。。现在是你在读书,而不是我在读书,如果说,我帮你写这些,对你会有帮助的话,那么我可以帮你写……但实际上会有帮助吗?表示质疑!
建议你采用我给你分析的第二种方法去实现,它相对比较科学,算法的时间复杂度比第一种算法要小的多~~~
求解的思路很简单,首先,我们取一个5的倍数且不大于待求数(题中为100)的数,求它分解出因子5的个数,之后将这个数递减5,重复上个步骤,直到将这个数递减到0,然后将以上所得到的因子数相加即得到结果。
另外一种思路就是:首先求出不大于待求数并且为5的倍数的自然数的个数,求出不大于待求数并且为25的倍数的自然数的个数,求出不大于待求数并且为125的倍数的自然数的个数……
然后将他们相加起来,当然还要扣掉重叠的部分……
这里,把第一种解法的程序写出来给你:
#include<iostream.h>
int main()
{
int n;
cout<<"Please input a number:";
cin >> n;
int factor5_count = 0;
while (n % 5 != 0)
{
n --;
}
while (n > 0)
{
int tmp = n;
while (tmp % 5 == 0)
{
factor5_count ++;
tmp /= 5;
}
n -= 5;
}
cout << factor5_count << endl;
return 0;
}
至于你说的 写出设计过程、需求分析、设计结构(包括总体结构和数据结构)、实验中出错信息及处理方法及解决错误的方法、指出实验结果运行的操作系统和平台,运行结果。
呵呵。。。。现在是你在读书,而不是我在读书,如果说,我帮你写这些,对你会有帮助的话,那么我可以帮你写……但实际上会有帮助吗?表示质疑!
建议你采用我给你分析的第二种方法去实现,它相对比较科学,算法的时间复杂度比第一种算法要小的多~~~
追问
这好像V6的,我不会转化,您看能不能,改一下下,百拜
追答
跟平台无关,自己建个工程,贴代码~~
展开全部
#include <iostream.h>
#include <stdio.h>
int CountZero(int n)
{
if (n < 5)
{
return 0;
}
int i,m = 0,k = 0;
for (i = 5; i <= n;)
{
m = i;
while (m%5 == 0) //能被5整除
{
m = m/5;
k++;
}
i += 5; //增加5
}
return k;
}
int main()
{
int i = 100;
printf("%d! include %d '0'",i,CountZero(i));
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rufeng18/archive/2008/09/08/2899778.aspx
#include <stdio.h>
int CountZero(int n)
{
if (n < 5)
{
return 0;
}
int i,m = 0,k = 0;
for (i = 5; i <= n;)
{
m = i;
while (m%5 == 0) //能被5整除
{
m = m/5;
k++;
}
i += 5; //增加5
}
return k;
}
int main()
{
int i = 100;
printf("%d! include %d '0'",i,CountZero(i));
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rufeng18/archive/2008/09/08/2899778.aspx
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/*时间:2011年6月21日
*@作者:风之风信子
*@功能:测试100!的最后有多少个0。
*@思路:1、第一个函数是测试比较小的数最后有几个零。
可以输入一个比较小的数字,比如8、11等。
使用的方法是求得一个数字的阶乘之后,如果次数字能被10整除,那么后面就多一个0。
2、第二个函数是测试1到100这100个整数之间有多少个能被5整除的数字。
这个函数是在第一个函数在输入100得不到结果的基础上使用的。
3、程序最后用注释括起来的部分是检测你电脑最多能正确算多少个数的阶乘的。
你可以写在报告中,但是提交整个程序的时候要去掉。
*@建议:功能和使用方法我已经写的很明白了,
我愿意相信整个百度知道都没有我对你这么上心的。
看到你的提问的标题,我哑然失笑。细细想想我似乎也这么过来的。
我倒不是贪你的那点分,是真的想让你多学点东西。课程设计是很好的练手方法,
本科的时候我的课程设计都在玩中过去了,现在上了研究生才知道那段时光的宝贵。
把程序贴在这里是为了让更多的人可以学习,如果你不想给我分那就算了。
小弟弟,听我一句话,dota什么时候都可以玩,前程一玩就没了。
我在程序里打的代码很整齐,到了这里排版的问题有点乱了。
代码绝对正确,而且十分友好,你自己调试一下吧。
*/
#include <iostream>
int factorial(int);//声明求阶乘的函数。
int findzero_num(int);//声明求一个整数最后有多少个零的程序。(思路中说的第一个函数。)
int findzero_five(int);//声明测试1到100这100个整数之间有多少个能被5整除的数字的函数。(思路里说的第二个。)
using namespace std;
void main()
{
int text_num;//输入的数字。
char judge_num;//判定的符号。
cout<<"这是一个检测你输入数字的阶乘最后有几个零的程序。"<<'\n'<<endl;
cout<<"请输入你想测试的数字。"<<endl;
cin>>text_num;
if (text_num<=12)//经过我的测试,我电脑最多可以算到12!不出错,
//你自己测试一下你的,这个过程写入报告。
//测试程序我放到最后用注释括起来。
{
cout<<"这个数字的阶乘是:"<<factorial(text_num)<<endl;
cout<<"这个数字阶乘后边有"<<findzero_num(factorial(text_num))<<"个零。"<<endl;
}
else//输入大于12的情况。
{
cout<<"你输入的数字是"<<text_num<<",它已经过大,它的阶乘计算机已经不能合理显示了。"<<'\n'<<endl;
cout<<"但是我还是有其他的方法,你想试试吗?想的话请输入y,不想的话请输入n。"<<endl;
cin>>judge_num;
if (judge_num=='y')
{
cout<<"好的,这种方法是检测从1到"<<text_num<<"之间有多少个能被5整除的数字。"<<endl;
cout<<"从1到"<<text_num<<"之间的数字有"<<findzero_five<<"个能被5整除。"<<'\n'<<endl;
cout<<"所以,"<<text_num<<"!最后有"<<findzero_five(text_num)<<"个零。"<<endl;
//调用函数2;
}
else
{
cout<<"那你自己想办法去吧!"<<endl;
}
}
}
int factorial(int num)//定义求阶乘的函数。
{
int i;
long fac_num=1;
for(i=1;i<=num;i++)
{
fac_num=fac_num*i;
}
return(fac_num);
}
int findzero_num(int num)//定义求一个整数最后有多少个零的程序。
{
int text_num;//检测参数
int zero_num=0;//最后得到的结果。
for(;;)
{
text_num=num/10;
if(text_num==0)//如果数字小于10,就跳出循环了。
{
break;
}
if (num%10==0)
{
zero_num++;
}
num=num/10;
if(num%10!=0)//如果数字从后往前数遇到不是0的数,跳出循环。
{
break;
}
}
return (zero_num);
}
int findzero_five(int num)
{
int i;
int zero_num=0;//最后的结果。
for (i=1;i<=num;i++)
{
if (i%5==0)
{
zero_num++;
}
}
return (zero_num);
}
/*
//以下为这是一个测试你电脑最多能正确计算到多少个数的阶乘的函数。
//使用的时候去掉"/ * * /"注释符号。
#include <iostream>
int factorial(int);
using namespace std;
void main()
{
int text_num;
cout<<"这是一个测试你电脑最多能正确计算到多少个数的阶乘的函数。"<<'\n'<<endl;
for(;;)//设置一个无条件循环,反复输入数字,检测结果。
{
cout<<"请输入你想测试的数字。"<<endl;
cin>>text_num;
cout<<"这个数字的阶乘是:"<<factorial(text_num)<<endl;
}
}
int factorial(int num)
{
int i;
long fac_num=1;
for(i=1;i<=num;i++)
{
fac_num=fac_num*i;
}
return(fac_num);
}
*/
*@作者:风之风信子
*@功能:测试100!的最后有多少个0。
*@思路:1、第一个函数是测试比较小的数最后有几个零。
可以输入一个比较小的数字,比如8、11等。
使用的方法是求得一个数字的阶乘之后,如果次数字能被10整除,那么后面就多一个0。
2、第二个函数是测试1到100这100个整数之间有多少个能被5整除的数字。
这个函数是在第一个函数在输入100得不到结果的基础上使用的。
3、程序最后用注释括起来的部分是检测你电脑最多能正确算多少个数的阶乘的。
你可以写在报告中,但是提交整个程序的时候要去掉。
*@建议:功能和使用方法我已经写的很明白了,
我愿意相信整个百度知道都没有我对你这么上心的。
看到你的提问的标题,我哑然失笑。细细想想我似乎也这么过来的。
我倒不是贪你的那点分,是真的想让你多学点东西。课程设计是很好的练手方法,
本科的时候我的课程设计都在玩中过去了,现在上了研究生才知道那段时光的宝贵。
把程序贴在这里是为了让更多的人可以学习,如果你不想给我分那就算了。
小弟弟,听我一句话,dota什么时候都可以玩,前程一玩就没了。
我在程序里打的代码很整齐,到了这里排版的问题有点乱了。
代码绝对正确,而且十分友好,你自己调试一下吧。
*/
#include <iostream>
int factorial(int);//声明求阶乘的函数。
int findzero_num(int);//声明求一个整数最后有多少个零的程序。(思路中说的第一个函数。)
int findzero_five(int);//声明测试1到100这100个整数之间有多少个能被5整除的数字的函数。(思路里说的第二个。)
using namespace std;
void main()
{
int text_num;//输入的数字。
char judge_num;//判定的符号。
cout<<"这是一个检测你输入数字的阶乘最后有几个零的程序。"<<'\n'<<endl;
cout<<"请输入你想测试的数字。"<<endl;
cin>>text_num;
if (text_num<=12)//经过我的测试,我电脑最多可以算到12!不出错,
//你自己测试一下你的,这个过程写入报告。
//测试程序我放到最后用注释括起来。
{
cout<<"这个数字的阶乘是:"<<factorial(text_num)<<endl;
cout<<"这个数字阶乘后边有"<<findzero_num(factorial(text_num))<<"个零。"<<endl;
}
else//输入大于12的情况。
{
cout<<"你输入的数字是"<<text_num<<",它已经过大,它的阶乘计算机已经不能合理显示了。"<<'\n'<<endl;
cout<<"但是我还是有其他的方法,你想试试吗?想的话请输入y,不想的话请输入n。"<<endl;
cin>>judge_num;
if (judge_num=='y')
{
cout<<"好的,这种方法是检测从1到"<<text_num<<"之间有多少个能被5整除的数字。"<<endl;
cout<<"从1到"<<text_num<<"之间的数字有"<<findzero_five<<"个能被5整除。"<<'\n'<<endl;
cout<<"所以,"<<text_num<<"!最后有"<<findzero_five(text_num)<<"个零。"<<endl;
//调用函数2;
}
else
{
cout<<"那你自己想办法去吧!"<<endl;
}
}
}
int factorial(int num)//定义求阶乘的函数。
{
int i;
long fac_num=1;
for(i=1;i<=num;i++)
{
fac_num=fac_num*i;
}
return(fac_num);
}
int findzero_num(int num)//定义求一个整数最后有多少个零的程序。
{
int text_num;//检测参数
int zero_num=0;//最后得到的结果。
for(;;)
{
text_num=num/10;
if(text_num==0)//如果数字小于10,就跳出循环了。
{
break;
}
if (num%10==0)
{
zero_num++;
}
num=num/10;
if(num%10!=0)//如果数字从后往前数遇到不是0的数,跳出循环。
{
break;
}
}
return (zero_num);
}
int findzero_five(int num)
{
int i;
int zero_num=0;//最后的结果。
for (i=1;i<=num;i++)
{
if (i%5==0)
{
zero_num++;
}
}
return (zero_num);
}
/*
//以下为这是一个测试你电脑最多能正确计算到多少个数的阶乘的函数。
//使用的时候去掉"/ * * /"注释符号。
#include <iostream>
int factorial(int);
using namespace std;
void main()
{
int text_num;
cout<<"这是一个测试你电脑最多能正确计算到多少个数的阶乘的函数。"<<'\n'<<endl;
for(;;)//设置一个无条件循环,反复输入数字,检测结果。
{
cout<<"请输入你想测试的数字。"<<endl;
cin>>text_num;
cout<<"这个数字的阶乘是:"<<factorial(text_num)<<endl;
}
}
int factorial(int num)
{
int i;
long fac_num=1;
for(i=1;i<=num;i++)
{
fac_num=fac_num*i;
}
return(fac_num);
}
*/
更多追问追答
追问
学长,那个文件头不对,我实践的机房装的是VS2005,我不知道改,而且我有个疑问,就是您给的程序有选择项,但是却给出了最终结果,不需选择,这是不是个小问题?
追答
你自己建一个控制台工程,把代码黏贴到里面。实在不行让你同学帮帮你。这个创建工程是基础的基础,你用5分钟就会的。
选择项是在你输入数超过12的时候才出来的,如果你输入的是5,就直接出结果。
还有什么问题?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询