int b[][]={{1}, {2,2}, {2,2,2}};
二维数组的初识化
二维数组其实变成了 1 0 0
2 2 0
2 2 2
二维数组的地址
p+i ,i=0时,表示第一行的元素的地址, i=1时,表示第二行的元素,当i=0时,表示第一行的地址,但他输出的时候只会输出第一行第一个元素的地址,即他的值是第一行第一列元素的地址
*(p+i)把这一行解引用,找到了这一行的数组名,如:i=0时,*p就表示第一行的数组名,即用arr[0]来表示第一行的数组名,但是!arr[0]他既是数组名也是第一行第一列首元素的地址,所以他的值也是第一行第一列元素的地址。
因此对二维数组 a 来说,由于 a+1与*(a+1)的值相等,但二者的含义是不一样的,a+1表示二维数组中下标为一的一维数组的地址,*(a+1)表示下标为1的一维数组中下标为0的地址就是元素a[1][0]的地址
下面给出如何打印二维数组
2.常量的定义
常量定义的两种方式:
#define NUM 3.14159 const doulbe Num = 3.14159;
注意1:用define 定义时没有等号,且句末没有分号
用const定义时有等号,且句末有分号
注意2:定义常量时必须初始化,c项没有初始化,所以c项错误
3.浮点数的输出格式有以下程序,程序运行后的输出结果是()。
| 1 2 3 4 5 6 7 | float fun (int x,int y) { return (x+y); } void main() { int a=2,b=5,c=8; printf("%3.0fn",fun ((int)fun (a+c,b),a-c)); } |
%3.0f 中的0 表示输出小数点后0 位 如123.234 显示 123
%3.0f 中的3 表示输出这个数占用三列 如123 显示 123
故在本题中,结果是9,输出结果是空格 空格 9
4.运算,数位,位,字节一个 C 语言程序在一台 32 位机器上运行。程序中定义了三个变量 x 、 y 和 z ,其中 x 和 z 为 int 型, y 为 short 型。当 x=127 , y= - 9 时,执行赋值语句 z=x+y 后, x 、 y 和 z 的值分别是() 。
x=0000007FH,y=FFF9H,z=00000076H
x=0000007FH,y=FFF9H,z=FFFF0076H
x=0000007FH,y=FFF7H,z=FFFF0076H
x=0000007FH,y=FFF7H,z=00000076H
知识1:数字运算都是用补码运算的
知识2:正数的补码是其本身(也就是源码),负数的补码是原码取反加一(取反:符号位不变,剩余各位按位取反,加一,符号位不变,加一)
知识3:short类型是两个字节,int类型是4个字节
知识4:位,也称比特,是最小的存储单位
字节,1字节=8位
数位,如这个十六进制的数有八个数位 0000007FH,末尾的H代表他是十六进制的数。
知识5:在16进制中,1数位=4比特(16=2^4),short:2字节=16比特=4数位 ;int:4字节=32比特=8位
题解:
执行 z=x+y 时,由于 x 是 int 型, y 为 short 型,需将短字长数据转换成长字长数据,称之为“符号扩展”。由于 y 的符号位为 1 ,故在 y 的前面添加 16 个 1 ,即可将 y 上升为 int 型,其十六进制形式为 FFFFFFF7H 。最后执行加法,即 0000007FH +FFFFFFF7H=00000076H ,其中最高位的进位 1 自然丢弃。故选 D 。
5.求和超出范围错误答案
#includeint main() { int n=0,i; scanf("%d",&n); int sum=0; for(i=0;i<=n;i++) { sum+=i; } printf("%dn",sum); return 0; }
因为n<10^9,若n为一个很大的数,那他求和便更大,所以sum的类型应为long long int
正确答案
#include6.时间的转化int main() { int n=0,i; scanf("%d",&n); long long int sum=0; for(i=0;i<=n;i++) { sum+=i; } printf("%lldn",sum); return 0; }
知识1:
C语言可以使用printf的%0md格式在原来数字的基础上填充前导零,使得其总位数为m位。
其中,m代表输出的总位数。例如,m=3时,若原来输出x=22,则使用printf("%03d", x);输出022
错解:
#includeint main() { int a,b,minute; char c; scanf("%d%c%d %d",&a,&c,&b,&minute); int sum=a*60+b+minute; int a1=sum/60; int b1=sum%60; printf("%02d:%02d",a1,b1); return 0; }
错因:当所加时间过大时,就会超出一天,那么就不对了
因此,需要用sum取余1440(一天1440分钟),剩下的在进行运算
正解:
#include7.两个正整数的最大公约数与最小公倍数int main() { int a,b,minute; char c; scanf("%d%c%d %d",&a,&c,&b,&minute); int sum=a*60+b+minute; sum%=1440; int a1=sum/60; int b1=sum%60; printf("%02d:%02d",a1,b1); return 0; }
小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。
输入描述:每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109)
输出描述:对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和。
示例1输入: 10 20 输出 30
知识1:n,m可能非常大,故存储需要long long int 类型
以下代码虽然正确,但运行时间过长
#includeint main() { long long int n ,m; scanf("%lld %lld",&n,&m); long long int max=n>m?m:n; long long int min=n>m?n:m; while(1) { if(n%max==0&&m%max==0) break; max--; } while(1) { if(min%n==0&&min%m==0) break; min++; } printf("%lld",min+max); return 0; }
正解:辗转相除法



