二十一、C语言中无符号整型变量和有符号整型变量在同一系统中所占用的数据宽度一样.
不同的是:
有符号整型变量把数据的最高位作为符号位使用, 因此能表示数的正负, 表示范围: 对于16位的变量为: -32368<=变量<=32367, 对于32位的变量为:-2147483648<=变量<=2147483647;
无符号整型变量把数据的最高位仍作为数据位使用, 因此不能表示负数, 表示范围: 对于16位的变量为: 0<=变量<=65535, 对于32位的变量为: 0<=变量<=429467295
二十二、strlen() is an unsigned integer如果int i;后面接着for(i=0;i<strlen(line);i++),比较严格的编译器(如vc++6.0)就会发出警告warning C4018: '<' : signed/unsigned mismatch(在应该使用无符号变量的地方,使用了有符号变量,或者反之)应该改为for(i=0;i<(int)strlen(line)强制类型转化为有符号整型变量
二十三、HDOJ1020解题报告:
经过4个小时,几经修改,终于敲出来了:
#include<stdio.h>
#include<string.h>
main()
{
char line[10000];
int n,i,count[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
scanf("%d/n",&n);
while(n--){
gets(line);
for(i=0;i<(int)strlen(line);i++){
switch(line[i]){ //统计各字符的个数
case 'A':count[0]++;break;
case 'B':count[1]++;break;
case 'C':count[2]++;break;
case 'D':count[3]++;break;
case 'E':count[4]++;break;
case 'F':count[5]++;break;
case 'G':count[6]++;break;
case 'H':count[7]++;break;
case 'I':count[8]++;break;
case 'J':count[9]++;break;
case 'K':count[10]++;break;
case 'L':count[11]++;break;
case 'M':count[12]++;break;
case 'N':count[13]++;break;
case 'O':count[14]++;break;
case 'P':count[15]++;break;
case 'Q':count[16]++;break;
case 'R':count[17]++;break;
case 'S':count[18]++;break;
case 'T':count[19]++;break;
case 'U':count[20]++;break;
case 'V':count[21]++;break;
case 'W':count[22]++;break;
case 'X':count[23]++;break;
case 'Y':count[24]++;break;
case 'Z':count[25]++;break;
}
}
if(line[i]=='/0'){//一行输入完毕,输出
if(count[0]>1)
printf("%dA",count[0]);
if(count[0]==1)
printf("A");
if(count[1]>1)
printf("%dB",count[1]);
if(count[1]==1)
printf("B");
if(count[2]>1)
printf("%dC",count[2]);
if(count[2]==1)
printf("C");
if(count[3]>1)
printf("%dD",count[3]);
if(count[3]==1)
printf("D");
if(count[4]>1)
printf("%dE",count[4]);
if(count[4]==1)
printf("E");
if(count[5]>1)
printf("%dF",count[5]);
if(count[5]==1)
printf("F");
if(count[6]>1)
printf("%dG",count[6]);
if(count[6]==1)
printf("G");
if(count[7]>1)
printf("%dH",count[7]);
if(count[7]==1)
printf("H");
if(count[8]>1)
printf("%dI",count[8]);
if(count[8]==1)
printf("I");
if(count[9]>1)
printf("%dJ",count[9]);
if(count[9]==1)
printf("J");
if(count[10]>1)
printf("%dK",count[10]);
if(count[10]==1)
printf("K");
if(count[11]>1)
printf("%dL",count[11]);
if(count[11]==1)
printf("L");
if(count[12]>1)
printf("%dM",count[12]);
if(count[12]==1)
printf("M");
if(count[13]>1)
printf("%dN",count[13]);
if(count[13]==1)
printf("N");
if(count[14]>1)
printf("%dO",count[14]);
if(count[14]==1)
printf("O");
if(count[15]>1)
printf("%dP",count[15]);
if(count[15]==1)
printf("P");
if(count[16]>1)
printf("%dQ",count[16]);
if(count[16]==1)
printf("Q");
if(count[17]>1)
printf("%dR",count[17]);
if(count[17]==1)
printf("R");
if(count[18]>1)
printf("%dS",count[18]);
if(count[18]==1)
printf("S");
if(count[19]>1)
printf("%dT",count[19]);
if(count[19]==1)
printf("T");
if(count[20]>1)
printf("%dU",count[20]);
if(count[20]==1)
printf("U");
if(count[21]>1)
printf("%dV",count[21]);
if(count[21]==1)
printf("V");
if(count[22]>1)
printf("%dW",count[22]);
if(count[22]==1)
printf("W");
if(count[23]>1)
printf("%dX",count[23]);
if(count[23]==1)
printf("X");
if(count[24]>1)
printf("%dY",count[24]);
if(count[24]==1)
printf("Y");
if(count[25]>1)
printf("%dZ",count[25]);
if(count[25]==1)
printf("Z");
printf("/n");
i=0; //以下,每次循环的初始化
count[0]=0;
count[1]=0;
count[2]=0;
count[3]=0;
count[4]=0;
count[5]=0;
count[6]=0;
count[7]=0;
count[8]=0;
count[9]=0;
count[10]=0;
count[11]=0;
count[12]=0;
count[13]=0;
count[14]=0;
count[15]=0;
count[16]=0;
count[17]=0;
count[18]=0;
count[19]=0;
count[20]=0;
count[21]=0;
count[22]=0;
count[23]=0;
count[24]=0;
count[25]=0;
}
}
}
但是,“wrong answer!”和别人的一对比才发现我理解错了(或者说这题目不严谨)
输入 AAABBBCCCDDASDB
我的输出4A4B3C3DS
而AC了的程序输出3A3B3C2DASDB
但是这些题目没明确要求如此,样例里也看不出。
二十四、HDOJ1013解题报告:
下面是STL泛型版(不超时,AC了)
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
int main(int argc,char* argv[])
{
string s;
int sum;
while(cin>>s){
sum=0;
for(int i=0;i<s.size();i++){
if(s[i]=='1')sum+=1;
else if(s[i]=='2')sum+=2;
else if(s[i]=='3')sum+=3;
else if(s[i]=='4')sum+=4;
else if(s[i]=='5')sum+=5;
else if(s[i]=='6')sum+=6;
else if(s[i]=='7')sum+=7;
else if(s[i]=='8')sum+=8;
else if(s[i]=='9')sum+=9;
}
while(1){
if(sum<10){
printf("%d/n",sum);
break;
}
else
sum=sum/10+sum%10;//反复这样运算,知道sum<10输出
}
}
}
下面是C语言版(超时,为什么呢?两程序的算法是一样的啊)
#include<stdio.h>
#include<string.h>
main()
{
char a[10000];//定为100个单位长,为什么不可以?
char i,sum;
while((scanf("%s",a))!=EOF&&a[0]!='0'){
// if(a[0][北方民族大学2] =="0") break; //切记:此处不同于string类型的s(参见《ACM程序设计》page126)
sum=0;
for(i=0;i<(int)strlen(a);i++){
if(a[i]=='1')sum+=1;
else if(a[i]=='2')sum+=2;
else if(a[i]=='3')sum+=3;
else if(a[i]=='4')sum+=4;
else if(a[i]=='5')sum+=5;
else if(a[i]=='6')sum+=6;
else if(a[i]=='7')sum+=7;
else if(a[i]=='8')sum+=8;
else if(a[i]=='9')sum+=9;
}
while(1){
if(sum<10){
printf("%d/n",sum);
break;
}
else
sum=sum/10+sum%10;//反复这样运算,知道sum<10输出
}
}
}
二十五、平面上n条直线两两相交且无3条或3条以上直线共点,问有多少个不同交点?
(一)平面上N条直线两两相交且无3条或3条以上直线共点,有多少个不同交点
1条直线,和其它n-1条直线,都有1个交点。
就有n(n-1)个交点。
因为2条直线共有1个交点,所以要除以2。
有n(n-1)/2不同交点
(二)考虑n条交点,可以看作为是 n-1,n-2,n-3,…… 1条平行
除了平行的线,其他有交点的线就是和 n前面的解有关了
如 3:
3条平行, 交点 0
考虑2条平行,那剩下 1条和 那2条相交 , 1×2个交点,外加 1条线的方案只有 0,则为 2个交点
再考虑1条平行,剩下 2条与 1条相交 , 2×1,外加 2条线的方案有 0 1, 则有 2 ,3个交点
那总的方案就是 0 2 3
(三) 问题分析
将n 条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1,2最多有两个交点,。。。。。。,直线n 和其他n-1条直线最多有n-1个交点。由此得出n条直线互不平行且无三线共点的最多交点数:
Max = 1 +2 +。。。。(n-1)=n(n-1)/2;
但本题不这么简单,这些直线有多少种不同的交点数?
容易列举出i=1,2,3的情况如下图所示,来分析n=4的情况:
1. 四条直线全部平行,无交点
2. 其中三条平行,交点数: (n-1)*1 +0=3;
3. 其中两条平行,而另外两条直线的交点既可能平行也可能相交,因此交点数据分别为:
(n-2)*2+0=4
(n-2)*2+1=5
4. 四条直线互不平行, 交点数为(n-3)*3+3条直线的相交情况:
(n-3)*3+0=3
(n-3)*3+2=5
(n-3)*3+3=6
即n=4时,有0, 3, 4, 5, 6个不同的交点数.所有有5种可能
从上述n=4的分析过程中,发现:
M条直线的交点方案数=(m-r)条平行线与r条直线交叉的交点数+r条直线本身的交点方案=(m-r)*r +r条直线之间的交点数。
#include<stdio.h>
int main()
{
int i,j,n,f[21][191];
//f[i][j]表示i条边时,是否能产生j个结点,能,返回1,不能,返回0
for(i=0;i<21;i++)
for(j=0;j<191;j++)
f[i][j]=(j==0);
//f[i][0]都置1
for(n=2;n<21;n++)
for(i=n-1;i>=1;i--)
for(j=0;j<191;j++)
if(f[n-i][j]==1)
f[n][j+(n-i)*i]=1;
//如果f[n][x]==1
//f[n][x+((n-i)*i)]=1
while(scanf("%d",&n)!=EOF)
{
printf("0");
for(j=1;j<=n*(n-1)/2;j++)
if(f[n][j])
printf(" %d",j);
printf("/n");
}
return 0;
}
(四)解题思路:
对于任意的n(n为正整数)条直线
有以下情况:
1条平行(全不平行)时,(n-1)条线的所有情况+(n-1)*1
2条平行,(n-2)条线的所有情况+(n-2)*2
...
i条平行,(n-i)条线的所有情况+(n-i)*i
...
n-1条平行,1条线的所有情况+ 1*(n-1)