★难度稍微有点大的都要打草稿
时间长、效率低的根本原因:
算法低级
证据:1,约瑟夫环(笨方法—链表,巧妙—数学法) 2,二叉树(笨方法—模拟,巧妙—数学法(奇偶法))
事实证明:学好数学并巧妙利用是掌握高级算法的基础!!!!
评价一个程序的优劣可从以下几个方面考虑: 代码长度;运行效率;适用范围; 出错机率(变量的多 少、或使用高风险的函数,如gets或指针)。
提升方向:递归,指针,
位运算
2,编程之前,读懂题意(一字一句)输入,输出注意格式(最后一个不能有空格)
Int first = 1;
for ()
{
If ( first ) first = 0;
else printf ( “” );
Printf( “%d”, a[i] );
}
3,较大的数组(n>10^5)要放在main外面,否则会异常退出。
16,float a = 1.456保留2位小数并且四舍五入{ (int)(a*100+0.5)/100 } 20,善用break,continue;
21,scanf 后用gets的话,先打getschar();
22,float a[20]={0.1}; 只是把0.1赋给了a[0],其他的自动初始化为0.000; 23,重复使用同一变量或数组,一定要清零。。
25,判断一个事物是否具有某一性质的函数————谓词(predicate)
26,建议把谓词命名为is__xxx,如is__prime(即is it a prime?),返回值0表示假。
27,编写函数时,应尽量保证它能对任何合法参数都能得到正确的结果,如果不行,应在显著位置标明函数的缺陷,以免误用。 28,memset一个字节一个字节的赋值
需要的头文件
在C中<string.h>
在C++中 <cstring>
补充:一点技巧
memset可以方便的清空一个结构类型的变量或数组。
如:
structsample_struct
{
charcsName[16];
intiSeq;
intiType;
};
对于变量
structsample_strcutstTest;
一般情况下,清空stTest的方法:
stTest.csName[0]={'\0'};
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(structsample_struct));
如果是数组:
structsample_struct TEST[10];
则
memset(TEST,0,sizeof(structsample_struct)*10);
另外:
如果结构体中有数组的话还是需要对数组单独进行初始化处理的。
28,头文件和memset一样
int a[N], b[N]; memcpy( b, a, sizeof(int)*k) 把a中的前k个元素赋给b数组;
double a[N], b[N];memcpy( b, a, sizeof(double)*k) 把a中的前k个元素赋给b数组; memcpy( b, a, sizeof(a)) 把a中所有的个元素赋给b数组。
29,处理无符号的指令mul(乘)、div(除)、movzx
处理有符号的指令imul(乘)、idiv(除)、movsx
30,编译器默认为无符号指令
31,使用位段和二进制掩码时,才使用无符号数。
32,strlen的返回值是无符号数。
33,(32位)int的范围:(2147483647+1)即-2147483648或-0——2147483647
34,%d 十进制输出、%o(小写字母) 八进制、%x(如为小写,则输出小写;反之,大写)十六进制;
八进制数表示法(如10表示为012(数字零)),十六进制(20表示为0x14或0X14(数字));
如要输出前缀%#o, %#x, %#X;
%e 指数法输出
实用函数大集锦: 1, string头文
件 memset(多用来清零),memcpy(数组复制) 2, m
ath头文件 double si
n (double);正弦 double cos (double);余弦 double ta
n (double);正切 double sqrt (double);开平方 double
pow(double x, double y);计算以x为底数的y次幂 double cei
l (double); 取上整 double floor (double); 取下整 ,相当于
int强制转换 double fabs (double);求绝对值 3, s
tdio头文件 fge
ts( str, N, stdin/fin(文件名)); sprintf (s, “%d”, x)
把整数x变成字符串s ; fprintf与之类似; sscanf (s, “%d”, &b) 把
字符串s以整数b输出。 4, c
type头文件 isalpha是否为英文字母 isdigit isu
pper islower ispunct是否为标点符号 toupper tolower 5, #
in
clude<assert.h>作用: 规定参数范围,限制非法的函数调用,“迫使”程序员编出
高质量的程序 示例:intis_prime( int x ) { assert
( x>=0 ); }
输入结束
标志: 1, gets != NULL 返回值:它收到的字符串的地址 表示gets函数
没有获得任意数据之前如果遇到文件结尾标志将返回NULL。可以这样测试一下,运行程序,不输
入任何字符,直接按ctrl+z。。 2, s
canf ( “%d%d”, &a, &b )==2; s
canf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数;
当scanf函数的第n个变量格式不正确时,返回值为n-1. 3, g
etchar() != EO
F char c; c = getchar; putchar(c);也可以 getchar的返回
值为该字符的ASCII码值(int)
调试技巧:
1,watch窗口中,在整形变量后面加上",c"可以显示该变量对应的ASCII字符; 'v',d就是显示字符'v'对应的十进制ASCII码值是118; 'v',x显示的是对应的十六进制的ASCII码值;
watch窗口中,把指针当成数组看,只要在指针名后面加上一个长度,就可以想看数组一样看到对应的数据了。比如我上面的a,4。那么如果一个指针指向的数据很大,比如一个整形指针a是指向一个1000个 整数的大块内存,我只想看看最后4个数据,要怎样呢?那就 (a+996),4 呗。从第996个数据开始,看4个~;
在watch窗口中察看错误原因,只需要在错误之后面颊上",hr"就可以了。比如我上面的dwError,hr和 2, hr都能够显示错误消息;
2,Figure
1设置高级位置断点
2 然后选择D行所在的断点,然后点击condition按钮,在弹出对话框的最下面一个编辑框中输入一个很大数目,具体视应用而定,这里1000就够了。
3 按F5重新运行程序,程序中断。Ctrl+B打开断点框,发现此断点后跟随一串说明:...487 times remaining。意思是还剩下487次没有执行,那就是说执行到513(1000-487)次时候出错的。因此,我们按 步 骤2所讲,更改此断点的skip次数,将1000改为513。
4 再次重新运行程序,程序执行了513次循环,然后自动停在断点处。这时,我们就可以仔细查看DoSome是如何返回0的。这样,你就避免了手指的痛苦,节省了时间。 再看位置断点其他修饰条件。如Figure 1所示,在“Enter the expression to be evaluated:”下面,可以输入一些条件,当这些条件满足时,断点才启动。譬如,刚才的程序,我们需要i为100时程序停下来, 我们就可以输入在编辑框中输入“i==100”。
另外,如果在此编辑框中如果只输入变量名称,则变量发生改变时,断点才会启动。这对检测一个变量何时被修改很方便,特别对一些大程序。
用好位置断点的修饰条件,可以大大方便解决某些问题。
3,对于用while输入多组数据,一定多测几次,及时发现数据溢出或未清零等事故。
数
据
类
型
及
其
范
围
1, i
n
t
(
3
2
位
)
-
(
2
^
31)——(2^31-1) 即-2147483648——2147483647 2, u
nsigne
d int0——(2^32-1) 即 0——4294967295 3, f
loat–(2^128
)——(2^128) 即 -3.40*10^38——3.40*10^38 4, d
ouble –
(2^1024) ——(2^1024) 即 -1.79*10^308——1.79*10^30
8 其中 float 4字节共32bits, 1bit(符号),8bits(指数),23bi
ts(尾数),精确到6位小数,不安全; double 8字节共64bits, 1bit(符
号
)
,
1
1
b
i
t
s
转义序列:1,\a 铃声(提醒) (指数),52bits(尾数),精确到15位小数。
2,\f 换页
3,\r \n 回车换行 4,\t 水平制表符 5,\v 垂直制表符 6,\’单引号 7,\”双引号 8,\\ 反斜杠 9,\? 问号
第二篇:C语言小结
C语言小结
一、 C语言结构
1、主函数用main作为函数名,每个C程序都必须包含且仅含一个main函数,C程序的执行是从主函数中的第一句开始,到主函数中的最后依据结束
2、头文件的引用#include<name.h>或#include“name.h”
3、函数由函数首部和函数体组成:函数首部,即函数的第一行,包括函数名、函数类型、函数参数名和参数类型,一个函数后面必须跟一对圆括号;函数体,及函数首部下面的花括号{}内的部分,如果一个函数内有多个花括号,最外层的一对{}为函数体的范围
二、 数据类型及其运算
1、标识符:标识符可作变量名、符号名、函数名、数组名、文件名以及具有特定含义的名字。合法的标识符由字母、数字和下划线组成,并且第一个字符必须为字母或下划线,C语言区分字母大小写
2、数据类型
分类: 整型: int,长整型以long int或long表示;实型:单精度float、双精度double、长双精度型long double; 字符型:char 结构体:用户定义的一种数据结构,它包含若干个不同数据类型(当然也可以相同)的数据项,这些数据之间有内在的联系 共用体:使几个不同的变量共占同一段内存的结构 指针类型:专门用来存放地址的数据类型 空类型:在定义的时候不确定数据类型,而在使用的时候通过强制转换来确定的数据类型 定义:结构体如:struct student {int num;char name[20];}student1,student2; 共用体:union共用体名{成员表列}变量表列; 空类型:基本型 *指针变量名 如float *p;
3、C运算符的种类、运算优先级和结合性 见课本365面(很重要)
4、数据转换:自动转化(内存长度低的向高转) 强制转换: 将结果转换成所需要的数据类型,如;float s=1.23; int a; a=(int)s;
5、 C表达式类型和求值规则:
赋值表达式:<变量><赋值运算符><表达式> 算术表达式 关系表达式:一般表达式:<表达式1><关系运算符><表达式2>(“真”用1表示“假”用0表示) 逻辑表达式:一般形式<表示式1><逻辑运算符><表达式2>(真1、假0) 条件表达式:一般形式:表达式1?表达式2:表达式3 逗号表达式:一般形式:表达式1,表达式2,??,表达式n。整个逗号表达式的值为表达式n的值
例:已有定义:int x=7,y=8,z=9;,则表达式!(x+y)+z-1&&y+z/2的值为1
三、 基本语句
1、简单语句: 空语句: “;”占一个语句位置,但并不执行任何操作 说明语句:这是对数据和函数进行描述的语句,如定义变量语句、外部变量申明和函数声明等。所有说明语句都必须放在其他非说明语句(或执行语句)之前 表达式语句:一定要有分号,分号是语句的一部分 流程控制语句:分为两类:构成流程的控制语句,如if语句、switch语句和while语句、do-while语句、for语句;流程转向语句,如break语句、continue语句、return语句和goto语句 复合语句:复合语句之后不必再用分号结束
2、数据的输入与输出:输入;getchar()函数 作用是从终端设备接受一个字符,只有按下Enter键时,读入才开始;scanf(格式控制符串,输入项地址表);输出:putchar()函数 作
用是向终端输出一个字符;printf(格式控制字符串,输出表链);
格式字符:f格式符:%m.nf指定输出的数据共占m列,其中有n位小数,如果数值长度小
于m,则左端补空格; o格式符:以八进制数形式输出整数; x格式符:以十六进制数
形式输出整数; u格式符:用来输出unsigned类型数据,即无符号数,以十进制形式输
出
四、选择结构程序设计
1、if语句:(1)、if(表达式)语句 (2)、if(表达式) 语句1
else 语句2
(3)、if(表达式1)语句1 (4)、 if(表达式1) else if(表达式2)语句2 if(表达式2)语句1 else if(表达式3)语句3 else 语句2 ?? else
else if(表达式m)语句m if(表达式3)语句3 else 语句n else 语句4 (注意:else总是和它上面的最近的未
配对的if配对)
2、switch语句:
(1)、 (2)、switch(表达式1) switch(表达式) {case 常量表达式1-语句1 {case 常量表达式1-语句1 case 常量表达式2:switch(表达式2)语句2 case 常量表达式2-语句2 case 常量表达式3:switch(表达式3)语句3 ?? ??
case 常量表达式n-语句n case 常量表达式n:switch(表达式n)语句n default :语句n+1 default :语句n+1 } }
五、循环结构程序设计
1、for循环结构:一般表达式为:for(表达式1;表达式2;表达式3){??}
可以改为while循环:表达式1;
while(表达式2)
{语句
表达式3;
} (注:“ for(;;) ”相当于“ while(1) ”
2、while和do-while循环结构: while语句的一般形式:while(表达式) do-while就语句的一般形式:do {语句} {循环体语句} while(表达式);
3、continue语句和break语句: (1)、continue语句的一般形式为:continue; 其作用
是结束本次循环,即跳过循环体内continue语句后面尚未执行的语句,接着进行下一次是否
执行循环的判定
(2)、break语句的一般形式是:break; 跳出循环体,即提前结束循环,接着执行循环后面
的语句,break语句不能用于循环语句和switch语句之外的任何其他语句
注:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整
个循环,不再判断执行循环体的条件是否成立。
4、循环的嵌套:(1)、while() (2)、do (3)、for(; ;) { ? {? {? while() do for(; ;) {?} {?} {?} } while(); } }
(4)、while() (5)、for(; ;) (6)、do {? {? {? do while() for(; ;) {?} {?} {?} while(); ? } ? } while(); }
六、 数组的定义和引用
1、数组的定义与引用:定义数组时,[ ]不能写成(),数组长度必须明确指定;
赋初值时,可以不明确说明数组长度(注:不能使用如下形式数组元素赋以相同的初值:如
int a[8]={8*0};)
2、字符数组:系统对字符串常自动加一个作为结束’\0’标志 (#include<string.h>)
字符串处理函数:printf()函数,一般形式是:printf(“%m.ns”,字符类型指针); puts()
函数,一般形式是:puts(字符类型指针); scanf()函数,一般形式是:scanf(“%ms”,字符
类型指针); gets函数,一般形式是:gets(字符类型指针); 字符串连接函数strcat()
函数,一般形式是:strcat(字符数组1,字符数组2);(数组必须足够大) 字符拷
贝函数strcpy()函数,一般形式是:strcpy(字符数组1,字符串2); (作用是将字符串2复制到
字符数组1中去) 字符串比较函数strcmp()函数,一般形式是:strcmp(字符串1,
字符串2)(串1=串2,返回0;串1>串2,返回一正整数;串1<串2,返回一负整数) strlen()函数,一般形式是:strlen(字符型指针);(测字符串的实际长度)
七、 函数
1、有参函数的定义:类型标识符 函数名 (形式参数列表)
{ 声明部分 语句 }
“定义”是指对函数功能的确立,包括指定函数函数名、函数类型、形参及其类型、函数体
等,它是一个完整的、独立的函数单位 “声明”的作用则是把函数名、函数类型以及
形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如
函数名是否正确,实参与形参的类型和个数是否一致)但int型可不声明
2、函数的返回值:return;如此使用return语句时,只起控制流程的作用,不带回任何值,
故次时函数亦为void型 return 表达式; 此表达式的值就是函数的返回值
3、形参、实参和参数值的传递:参数值传递分为:值传递和传地址。值传递不改变实参的
值,传地址一般是指指针变量作形参(改变实参的值)
4、函数的调用:函数不能嵌套定义,但可以嵌套调用、递归调用
5、静部变量用“static”声明 ,寄存器变量用进行“register”声明 ,外部变量用“extern”
声明,自动变量用“auto”声明,“auto”可省略 ,在函数类型(名)加extern表示外部函数
八、 编译预处理
1、宏定义:不带参的一般形式为:#define 标识符字符串 带参的一般形式为:#define
宏名(参数表)字符串 可以用#undef命令终止宏定义的作用域 宏定义只代换
不分配内存,宏定义不存在类型问题,宏定义不占运行时间,只占编译时间每展开一次都使
程序增长,而函数调用不会使程序变长
2、条件编译的几种形式(1)、# ifdef标识符 (2)、# ifndef标识符 (3)、# if表达式 程序段1 程序段1 程序段1 # else # else # else 程序段2 程序段2 程序段2 # end if # end if # end if
九、 指针
1、地址即指针,一般定义为:基本类型 *指针变量名
2、只有整型变量的地址才能放到指向整型变量的指针变量中
3、指针变量作为函数参数:不能企图通过改变指针形参的值而使指针实参的值改变
4、数组与指针:如果指针变量p一指向数组中的一个元素,则p+1指向同一数组中的下一
个元素 p+i和a+i就是a[i]的地址 指向数组的指针变量,p[i]与*(p+i)等价 数组
a代表数组首元素的地址,它是一个指针常量,所以a++是无法实现的 *p++等价于
*(p++) 如果用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的
单元 二维数组a[2]值就是&a[2][0] a[0]+1和*(a+0)+1都是&a[0][1] *(a[i]+j)或
*(*(a+i)+j)是a[i][j]的值 *(a+i)和a[i]等价 a[i][j]的地址为&a[0][0]+i*m+j 字符
数组可以在定义时整体赋初值,但不能在赋值语句中整体赋值
5、p+i代表地址计算:p+c*i,c为字节数 不应把一个整数赋给指针变量,只能将变量的
地址赋给指针变量
十、 位运算
1、如有一个整数a(2字节),想要其中的低字节,只需将a与八进制数377按位与即可,
如想取其高字节,只需c=a&0177400(0177400表示八进制数的177400)
2、假如a=3,b=4.想要a和b的值互换,可以用如下赋值语句实现:
a=a^b;
b=b^a;
a=a^b; (课本325页例12.2也比较重要)
十一、 文件操作
1、分为ASCII文件和二进制文件 文件型指针:FILE *fp;
2、了解常用函数的格式: 打开一个文件:if((fp=fopen(“file1”,r))==NULL)
{printf(“cannot open this file\n”);
Exit(0);
}
fputc函数的功能是把一个字符写到磁盘文件上,一般形式是fputc(ch,fp) ch是要输出的字
符,fp是文件指针变量 fgets函数的功能是从指定的文件读入一个字符串,一般形式是
fgets(str,n,fp); str是字符数组,n为要求得到的字符个数,fp是文件指针变量
fscanf()函数的功能是根据文本文件中的格式输入数据,一般形式是:fscanf(文件指针,格式控制字符串,输出列表); fprintf()函数的功能是将内存中的数据转换,并以ASCII码形式输出到文本五文件中,起调用的一般形式为:fprintf(文件指针,格式控制字符串,输出表列)
十二、 特别提醒
1、3种基本结构:顺序结构,选择结构,循环结构
2、不能把一个字符串常量赋给一个字符变量
3、注意++,--(右结合性) (i的值为3)(i++)+(i++)+(i++)的值为9; (++i)+(++i)+(++i)的值
4、课本48页 表3-3,81页 表4-1, 243页 表10-2,276页 表10-4,333页 表13-1,347页 表13-3,364页 附录A,365页 附录C
十三、 速做机试
1、windows 操作可使用快捷键(如:Ctrl+c复制,Ctrl+v粘贴,选中后按F2重命名),能快速使用键盘也是件好事,使用鼠标打开最好双击,不要点右健,再点打开那样会很慢
2、改错、填空:类推,比方说:若i=0;那行错了,则很可能是i=1;
3、程序设计:牢记报告上一些基本程序,比方说:排序,公倍数公约数,同构数,素数 例 :水仙花数 (一个三位正整数,其个位数字的立方和等于该数本身)
若i是一个三位数,则百位数为a=i/100 十位数为b=i/10%10 个位数为c=i%10
1)、 for (a=1;a<=9;a++)
for (b=0;b<=9;b++)
for (c=0;c<=9;c++)
if (a*100+b*10+c==a*a*a+b*b*b+c*c*c) s+=a*100+b*10+c;
素数 1)、for (i=101;i<500;i+=2) 2)、isp(int a)
{ {int t,j; j=1;t=2;
for (j=2;j<=i/2;j++) while((t<=a/2)&&j)
if (i%j==0) break; { if(a%t==0) j=0;
if (j>i/2 && i%10!=3) s+=i; else t=t+1;
} }
return(j);
}
计算1+2+3+4+?+n<2000的最大n的值
int n=0,s=0;
while(s<2000)
s = s + (++n);
n--;
s=1+1/12+1/123+1/1234+1/12345
for (i=1;i<=5;i++)
{
t=t*10+i;
s=s+1.0/t;
}
计算100以内的全部同构数之和(同构数即:它出现在它的平方数的右端)
for(i=1;i<100;i++)
if( ( (i*i-i) % (i<10?10:100)==0 ))
s=s+i;
int i,s=4;
for (i=1;i<8;i++)
s=(s+2)*3;
完全数:(一个数如果恰好等于它的因子(自身除外)之和)
do
{if(k%i==0) sum+=I;
i++;}
while(i<=k/2);
最大公约数和最小公倍数
int fun1(int m,int n) int fun2(int x,int y)
{int t,r; {return((x*y)/fun1(x,y)); if(m>n) }
{t=n; n=m; m=t;}
while(m!=0)
{r=n%m; n=m; m=r;}
return(n);
}
3*3二维矩阵的转置
for(i=0;i<3;i++) for(i=0;i<2;i++)
for(j=0;j<4;j++) for(j=i+1;j<3;j++)
y[j][i]=x[i][j]; {t=p[i][j]; p[j][j]=p[j][i]; p[j][i]=t;}
折半查找法
while((!sign)&&(top<=bott)) {mid=(bott+top)/2; if(numble==a[mid])
{printf(“it’s position is %d\n”,mid+1); sign=1;} else if(numble<a[mid]) bott=mid-1; else top=mid+1; 排序
冒泡法排序(对十个数排序) 选择法排序 for(j=0;j<9;j++) for(i=0;i<9;i++) for(i=0;i<9-j;i++) if(a[i]>a[i+1]) {t=a[i]; a[i]=a[i+1]; a[i+1]=t; } 杨辉三角
for(i=1;i<N;i++) {a[i][1]=1; a[i][i]=1;} for(i=3;i<N;i++) for(j=2;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j] for(i=1;i<N;i++) { for(j=1;j<=i;j++);
printf(“%6d”,a[i][j]); printf(“\n”); }
n的阶乘 float fac(int x) {float y;
if(x==0||x==1) y=1;
else y=fac(x-1)*x; return(y); }
比较三个数的大小
#define MAX(a,b) ( (a)>(b)?(a):(b) ) pintd(“max=%d\n”,MAX(MAX(a,b),c) );
字符串排序 if(strcmp(s[i],s[i+1])>0) {strcpy(tepm,s[i]); strcpy(s[i].s[i+1]); strcpy(s[i+1],temp); } (char temp[]; ) {min=i;
for(j=i+1;j<10;j++) if(a[min]>a[j]) min=j;
t=a[i]; a[i]=a[min]; a[min]=t; }
void sortstr(char **p) {int i.j; char *temp; for(i=0;i<5;i++)
{for(j=i+1;j<5;j++)
{if(strcmp(*(p+i),*(p+j))>0) {temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp;} } } }
数据循环左(右)移
左移c=(value>>(16-n))|(value<<n)
右移c=(value>>n)|(value<<(16-n))
求补码
unsign int getbites(unsign value)
{unsign int z;
z=value&0100000;
if(z==0100000) z=~value+1;
else z=value;
return(z);
}
求s=a+aa+aaa+?aa?a的值
while(i<=n)
{tn=tn+a;
sn=sn+tn;
a=a*10;
++I;
}
十四、小知识点小结
1、 对换两边的数据类型必须相同 malloc(sizeof( struct aa))
2、 计算机算法分为数值运算算法和非数值运算算法
3、 一个算法的特点:有穷性,确定性,零个或多个输入,一个或多个输出,有效性
4、 以ox开头的数是十六进制数
5、 一个int型的变量值的范围是-327668~32767
6、 指数形式:字母E(或e)之前必须有数字,且e后面的指数必须为整数 如:6.344e+003
7、 浮点型数据是按照指数形式存储的 float型变量只能接收七位有效数字
8、 初始化不是在编译阶段完成的(静态存储变量和外部变量除外),而是在程序运行时执
行本函数时赋初值的,相当于有一个赋值语句
9、 scanf(“%3d%3d”,&a,&b); 输入123456 则123赋给a,456赋给b 输入数据时不能规定
精度,即scanf(“7.2f”,&a);是不合法的
10、 在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入
11、 全局变量在程序的全部执行过程中都在用存储单元
12、 一个变量只能声明为一种存储类别
13、 (定义时不赋初值)对静态局部变量来说,编译时自动赋值0(对数值型变量)或
空字符(对字符变量),而自动变量,不赋值则它的值是一个不确定的值
14、 全局变量用static声明,则该变量的作用域只限于本文件模版
15、 内部函数static int fun(int a,int b) 外部函数extern int fun(int a,int b)
16、 只能对结构体变量中的各个成员分别进行输入和输出
17、 结构体变量.成员名 (*p).成员名 p->成员名 三者等价
18、 typedef int NUM[100];(声明NUM为整型数组类型) typedef可以声明各中类型
名,但不能用来定义变量,没有创造新类型
19、 “按位与”(&),如果两个相应的二进制位都为1,则该位的结果为1;“或”(|)
只要有一个为1,则为1;“异或”(^)同号为0;“取反”(~) 游侠儿
回文数的例子:回文数是指正读和反读都一样的正整数。例如3773等都是回文数。求出[100,9999]以内的回文数是6的倍数的最大回文数。
基本要求
1.根据题目要求设立合适的数据结构,分析数值规律;
2.回文判断用子函数实现;
3. 能够将所有回文数,能被6整除的回文数及最大的回文数等结果保存在文件中 如:所有回文数:??.
能被6整除的回文数:??.
最大回文:??. ??.
最佳答案 #include <stdio.h>
#include <stdlib.h>
int huiwen(char *str) /* 回文子函数 */
{
int len=strlen(str);
int i=0;
for(i=0; i<len/2; i++) {
if(*(str+i) != *(str+len-1-i)) return 1;
} return 0;
}
int main()
{ int i=0;
char str[5];
int hw6[10000] = {0};
int cnt=0;
int max=0;
printf("所有回文数:\n");
for(i=9999; i>=100; i--) {
memset(str, 0, 5);
sprintf(str, "%d", i);
if(huiwen(str) == 0) {
printf("%d\n", i); /* 这里把所有回文数打印出来 */
if(i % 6 == 0) {
hw6[cnt++] = i; /* 记录下被6整除的回文数 */
if(max == 0)
max = i; /* 最大被6整除的回文数,只会被执行一次 */
}
}
}
printf("能被6整除的回文数:\n");
for(i=0; i<cnt; i++) {
printf("%d\n", hw6[i]);
}
printf("最大回文数: %d\n",max);
}