这些程序是我自己一个一个写的,现拿出来让和我一样的初学者分享一下,用的是dev C++ 编译,里面包括详细的分析过程和代码注释,有两个文件,一个是c++/c 基础的,另一个是基础提高篇,我相信对初学者是有很大的帮助的! 同时里面有运行的图片,下载的同学可以先看题目,然后在自己去做,在和我比较一下思路,我写的不是很好的地方还望赐教
下载地址:http://tangxianghenggood.download.csdn.net/
科技职院
唐湘衡
1. //05-05-10 09:03
//99乘法表打印实例 通过此实例分析嵌套循环的使用,先内循环在外循环,可一步一步推导
// 99乘法表
#include
using namespace std;
int main()
{
int i,j; //j*i = i*j
cout<<" 99乘法表 "<
for (i=1; i<10; i++)
{
for (j=1; j<=i; j++)
{
cout< <<"*"< <<"="< <<" ";
}
cout<
}
system("pause");
return 0;
}
2. //06-05-10 15:07
/*古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月
后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数和总的数量为多少?
从键盘输入一个月份
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
思路:首先让前两个数都为1,然后从第三个数开始,让前两个数等于前面两数的和
*/
#include
using namespace std;
int main()
{
int i,num;
int m,n;
int sum=0;
cout<<"请输入一个月份数字:";
cin>>num;
m=1;
n=1;
for (i=1; i<=num; i++)
{
if (i%2==0) //控制换行,每输出4个换行
{
cout<
}
cout< <<" "< <<" ";
sum =sum+m+n;
m = m+n; //m=1,n=1 m=2
n = m+n; //n = 3 //m=2,n=3 m=5,n =8...
}
cout<
cout<<"这"< <<"个月兔子总数是:"< <<"个"<
system("pause");
return 0;
}
3. /*09-05-10 11:20
回文数的概念:一个数的平方和立方得到的数,左右都是对称的 如11,11*11=121, 11*11*11=1331
思路:此数要求对称,所有必须是两位数(这里输出1000内的回文数)由对称可知他们反序输出仍然为个数
利用这一点把它倒序输出,如与倒序输出相同即为回文数
打印如下:
m=11
m*m=121
m*m*m=1331
m=101
m*m=10201
m*m*m=1030301
m=111
m*m=12321
m*m*m=1367631
请按任意键继续. . .*/
#include
using namespace std;
bool IsTrue(long n); //判断是否是回文数函数声明
int main()
{
long i;
for (i=10; i<1000; i++)//因至少是个两位数,所以必须从10开始
{
if ( IsTrue(i) && IsTrue(i*i) && IsTrue(i*i*i) ) //判断条件
{
cout<<"i="<<<'/n'<<"i*i="< <<'/n'<<"i*i*i="< <
cout<
}
}
system("pause");
return 0;
}
bool IsTrue(long n) //判断是否是回文数
{
long m;
long k;
k = n;
m = 0;
while (k)
{
/*如101
第一次:k=101,m=0*10+101%10=1
第二次:k=101/10=10 ,m=1*10+10%=10
第三次:k=10/10=1. m=10*10+1%10=101
*/
m = m*10+k%10;
k = k/10;
}
return (m==n); //这个地方一定要注意了,如果m==n,注意是双等于,则返回真
}
4. /*求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。并输出2+22+222+2222+22222=结果(此时
共有5个数相加),几个数相加有键盘控制。
思路:有两大点:1求每项的值 2,输出这种格式 2+22+222+2222+22222
其实还是发现规律:看上面,两数之间相差a*10,只有发现这就ok了
*/
#include
using namespace std;
int main()
{
unsigned long int a,n;//n代表加a的次数
int count;
unsigned long sum,k;//sum代表总结果,k是临时的结果
unsigned long m;
count = 1;
sum = 0;
k = 0;
m = 0;
cout<<"请输入要计算的数a:";
cin>>a;
cout<<"请输入要计算次数n:";
cin>>n;
cout<<"s=";
/*a=1,n =3
count=1 k=0+a=1 输出1 sum=0+k=1 m=1*10=10
count=2 k=m+a=10+1=11 输出11 sum=1+11=12 m=11*10=110
count=3 k=110+1=111 输出111 m=111*10=1110 sum=12+111=123 m=111*10=1110
count=4>3 退出
*/
while (count<=n)
{
k = m+a;
cout< <<"+";
sum = sum+k;
m = k*10;
++count;
}
cout<<"="< <
system("pause");
return 0;
}
#include
int main (void)
{
unsigned long int s; /*总结果*/
unsigned long int temp; /*临时变量*/
int k;
int a; /*要计算的数*/
int n; /*计算的次数*/
int count; /*计数*/
s = 0;
temp = 0;
k = 0;
count = 1;
scanf("%ld%ld",&a,&n);
/*a=1,n =3
count=1 k=0+a=1 输出1 sum=0+k=1 m=1*10=10
count=2 k=m+a=10+1=11 输出11 sum=1+11=12 m=11*10=110
count=3 k=110+1=111 输出111 m=111*10=1110 sum=12+111=123 m=111*10=1110
count=4>3 退出
*/
printf("s=");
while (count<=n)
{
k = temp+a;
printf("%d+",k);
s = s+k;
temp = k*10;
++count;
}
printf("=%d",s);
getch();
return 0;
}
5. //29-04-10 08:51
//一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
//思路:把数限定在10万之内根据已有条件进行判断
#include
#include
using namespace std;
int main()
{
unsigned long int i,x,y,z; //要考虑数值范围
for (i=0; i<1000000; i++)
{
x = (sqrt(i+100));
y = (sqrt(i+268));
if (x*x == i+100 && y*y == i+268)
{
cout<<
}
}
system("pause");
return 0;
}
6. //输入某年某月某日,判断这一天是这一年的第几天?
//29-04-10 09:1
/* 设计思路:1.要对日历比较熟悉,这是关键
2.对年月日进行判断
年:平年365天,闰年366,闰年多一天 这多的一天是如何来的,网上查,
知道它是加载在2月份就行了 闰年判断:四年一闰,百年不闰,四百年再闰
3.月和日:判断,主要是天数
4:月份天数进行连加,及把上几个月的总天数也加进去
*/
/* 年 月 日
一年 12个月 365天
(1、3、5、7、8、10、12)叫大月 31天
(4、6、9、11)叫小月 30天
1996年(闰年) 2月 29天(全年有366天)
1997年(平年) 2月 28天(全年有365天)*/
#include
using namespace std;
int main()
{
int year,month,day;
int sum = 0; //保存天数
bool flag; // 用于判断是否为闰年的标志
flag = false;
cout<<"请输入年份:";
cin>>year;
cout<<"请输入月份:";
cin>>month;
cout<<"请输入日数:";
cin>>day;
//判断闰年
if ( !(year%400)||( (!year%4)&&year%100) )
{
flag = true;
}
//月份的天数
switch (month) //这是按平年计数天数的
{
case 1: sum = 0; break;
case 2: sum = 31; break;
case 3: sum = 59; break; //把1和2月份的天数加起来
case 4: sum = 90; break; //31+28+31
case 5: sum = 120; break;
case 6: sum = 151; break;
case 7: sum = 181; break;
case 8: sum = 211; break;
case 9: sum = 242; break;
case 10:sum = 272; break;
case 11:sum = 303; break;
case 12:sum = 334; break;
default:
cout<<"月份输入错误!"<
break;
}
//计算天数
sum = sum+day;
if (true == flag && month>2) //2月份多一天
{
sum++; //闰年加一天
}
cout<<"这是一年中的第"< <<"天"<
system("pause");
return 0;
}
7. //1234组成不重复的三位数
#include
using namespace std;
int main()
{
int i,j,k; //分别代表三位
for (i=1; i<5; i++)
{
for (j=1; j<5; j++)
{
for (k=1; k<5;k++)
{
if (i!=j && i!=k && j!=k) //保证三位数互不相同
{
//cout<< < <
cout< <
}
}
}
}
system("pause");
return 0;
}
8. /*07-05-10 19:58
输出结果: 1 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73
79 83 89 97 请按任意键继续. . .
素数的概率要理清:素数即只能被1和它自身整除的数,就不能在被其它数整除了其实素数和质数是同一个概念
如:1 3 5 7 11 13 17 19 23 29 31 37 41 43
思路:任何数都能被1和自身整除,素数区别在于除此之外还不能被其它的整除
首先,它一定是个奇数,肯定是整数,不能在被小于它的数整除了
*/
#include
using namespace std;
int main()
{
int i,j;
//bool f = true; //写在此处只输出1 3 5 7
for (i=1; i<100; i+=2) //限定在偶数范围进行寻找
{
bool f = true; //假设i是素数
for (j=2; j
{
if (i%j == 0 ) //如果此数i能被(2-自身) 的某一个数整除,就跳出内循环,
{ //进入外循环(进行下一个数的判断)
f = false;
break;
}
}
if (!f) //如果i在100之内,并且不能被 大于1和到自己范围 的数进行整除 不是素数
{
continue; //跳出打印 进入下一次数的判断
}
cout<<<" ";
}
system("pause");
return 0;
}
9. /*14-05-10 18:18
从键盘输入一字符串,统计英文字母,数字,空格的数量*/
#include
using namespace std;
int main()
{
char ch;
int spacecount = 0; //计算空格数量
int digitcount = 0; //计算数字数量
int zimucount = 0; //计算英文字母数量
int others = 0; //计算其它字符的数量
while ((ch =getchar())!='/n')
{
if (ch>='a'&&ch<='z' || ch>='A'&&ch<='Z')
{
zimucount++;
}
else if (ch == ' ')
{
spacecount++;
}
else if (ch>='0'&&ch<='9')
{
digitcount++;
}
else
{
others++;
}
}
cout<<"输入的字符串有英文字符:"< <<"个"<
cout<<"输入的字符串有数字:"< <<"个"<
cout<<"输入的字符串有空格:"< <<"个"<
cout<<"输入的字符串有其它字符:"< <<"个"<
system("pause");
return 0;
}
10.
/*12-05-10 08:11
正整数分解质因数:把一个正整数用质数相乘的方式表示出来,如果不能的话,打印此数90=2*3*3*5
程序思路:
对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,
重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
*/
#include
using namespace std;
int main()
{
int i,n;
cout<<"请输入要分解质因数的正整数:";
cin>>n;
cout< <<"=";
for (i=2; i<=n; i++) //2是最小的质因数
{
/*以90为例
i=2 90!=2 90%2=0,打印2 n = 90/2=45 i++
i=3 45!=3 45%3=0,打印3,n= 45/3=15 i++
此时n=15 仍然符合 n%i == 0打印3 n=15/3=5
i=4 5!=4 15%4!=0 break i++
i=5 5=5 跳出循环语句 打印5
*/
while (n!= i) //n!=i,进入分解
{
if (n%i == 0) //分解 yong 一个一个i去试,符合情况打印i,在把n除以i进行下一步运算
{
cout<<<"*";
n = n/i;
}
else //如果 n 不能被k整除,则退出本次循环
{
break;
}
}
}
cout<
system("pause");
return 0;
}
11. /*13-05-10 15:25
最大公约数和最小公倍数的定义要弄清,
编程思路:把两个数中最大的数对最小的数取模运算,
1.判断最大值
2. 如果num1%num2=0,最大公倍数即是小的那个数,最小公倍数及两数相乘除以最大公约数
3.如果num1%num2!=0 ,把较小的值赋给最大值,在把最大值取模最小值赋给最小值,然后在去取摸运算
直到两数取摸为0是才停止 最大公约数是最后的两数的模 这也叫碾除法 */
#include
using namespace std;
int main()
{
int m,n,temp,k,gys,gbs;
int man; //两数的乘积
cout<<"请输入两个数:";
cin>>m>>n;
man = m*n;
if (m
{
temp = m;
m = n;
n = temp;
}
/*m =18,n =12
1.k !=0 m =12,n =18%12=6
2.k =12%6=0 退出 gys =n = 6 */
while ( (k=m%n) != 0)
{
m = n;
n = k;
}
gys = n;
gbs = man/gys;
cout<<"两数的最大公约数是:"< <
cout<<"两数的最小公倍数是:"< <
system("pause");
return 0;
}
12. /*15-05-10 21:25
C++编程之完数
因子之和等于它本身的数为完数。如:28的因子是1,2,4,7,14,且1+2+4+7+14=28,则28为完数
思路:求出这个数的质因数,在把它相加保存于一个变量sum,最后把这个数和 sum比较,如相等则是完数
6 28 496 8128
*/
#include
using namespace std;
int main()
{
int n;/*代表2-1000之间的数 */
int k;//取值在1-n之间
int i;// 作为1000之内的完数输出计数
//int sum = 0; //sum放于此处会出错的
/*1. n=2, k=1, 2%1=0,sum=1; 而sum!=n 不输出n,但sum=1了
2.n=3,k=1, 3%1=0 sum =1+1了,这就是错误,即不管你是几,sum的值都在变化
*/
cout<<"2-10000之内的完数如下:"<
for (n=2; n<=10000; n++) //求10000之内的完数
{
/*求因数*/
int sum = 0;//求因数之和 初始化为0
for (k=1; k
{
if (n%k==0)
{
sum = sum+k;
}
}
//判断是不是完数
if (sum==n) //
{
cout< <<" ";
}
}
cout<
system("pause");
return 0;
}
13.猴子吃桃
/*16-05-10 00:47
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
编程思路:上面的问题扯了一大堆,其实只是分散我们的注意力而已,认真读题只有一点:从第一天开始
第二天吃的桃子是第一天数量的一半零一个,反过来就是:第一天的桃子数是第2天桃子数加1后的2倍 利用此关系求解
猴哥第一天摘了桃子1534个
*/
#include
using namespace std;
int main()
{
int day; //计算天数的变量
int first_ncount; //第一天吃的数量
int secondday_ncount; //第二天吃的数量
/*第一天n1(总数量)和第二天n2数量关系
顺推:n1/2-1=n2 ->n1=(n2+1)*2
第10天还剩个,即以此类推到最后 的第二天数量secondday_ncount=1
第9天:x9=2*(1+1)=4 x8=4
第8天:x8=2*(4+1)=10 x7=10
......
*/
secondday_ncount = 1; //第10天剩下的数量
for (day=9; day>0; day--) //倒推过去就行了
{
first_ncount = 2*(secondday_ncount+1); //满足此关系第九天数量
secondday_ncount = first_ncount; //第九天在作为第八天的第二天
}
cout<<"猴哥第一天摘了桃子"< <<"个哦"<
system("pause");
return 0;
}