注释分析都非常详细的c++ 源代码 基础篇

这些程序是我自己一个一个写的,现拿出来让和我一样的初学者分享一下,用的是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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值