涂色问题:(有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,
要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法):
__int64 d[51]={0,3,6,6};
for(i=4;i<51;i++)
d[i]=d[i-1]+2*d[i-2];
蜂房问题:(蜜蜂的行走路径)
__int64 num[101]={1,1,2};
for(i=3;i<100;i++)
num[i]=num[i-1]+num[i-2];
拿走当时羊的一半,然后退还一只:
f[i]=(f[i-1]-1)*2;
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法:
b[i+1]=b[i-1]+b[i];
给你几个点的坐标计算,这几个点所围图形的面积:
scanf("%d%d", &a[i], &b[i]); i++;}
for (i = 0; i < p - 1; i++)
c = c + 0.5*(a[i] * b[i + 1] - a[i + 1] * b[i]);
c = c + 0.5*(a[p-1] * b[0] - a[0] * b[p-1]);
统计给定文本文件中汉字的个数:
while(n--)
{
count=0;
while((c=getchar())!='\n')
{
if(c<0)
count++;
}
printf("%d\n",count/2);
求n个数的最小公倍数:
for(j=2;j<9999999999;j++)
{
c=0;
for(i=0;i<n;i++)
{
if(j%a[i]==0) c++;
}
if(c==n)
{
printf("%d\n",j);
break;
}
输出一个字符串中最大字符(需要中间变量的参与,才能更好的表现出来:这里的max用的很漂亮)
for(i=1;i<l;i++)
{
if(a[i]>=max)
{
max=a[i];
}
}
for (i = 0 ; a[i] ; i++)
{
putchar(a[i]);
if (a[i] == max)
printf("%s", "(max)");
}
满足合法字符的条件:
if((a[0]>='A'&&a[0]<='Z')||(a[0]>='a'&&a[0]<='z')||a[0]=='_')x++;
整数的取余问题(如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?)
for(i=1;i<=n;i++)
{
scanf("%d",&a);
sum+=a/100;
a=a%100;
sum=sum+a/50;
a=a%50;
sum=sum+a/10;
a=a%10;
sum=sum+a/5;
a=a%5;
sum=sum+a/2;
a=a%2;
sum=sum+a/1;
}
按绝对值由大到小的顺序输出:(问题不要想得太复杂)
for(i=0;i<n;i++)
for(j=i;j<n;j++)
{
if(fabs(a[j])>fabs(a[i]))
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数:(数列的追踪)
min=a[1];
for(i=2;i<=n;i++)
{
if(min>a[i])
{
min=a[i];
c=i;
}
}
a[c]=min;
t=a[1];
a[1]=a[c];
a[c]=t;
比较三个字符之间的大小顺序,并按大小顺序输出:
x=a>b?(a>c?a:c):(b>c?b:c);
y=a<b?(a<c?a:c):(b<c?b:c);
z=a+b+c-x-y;
输入一列数(有的数相同,有的数相同有的不同),按照由小到大的顺序输出,(没有重复的数):基本思路就是,先按大小顺序排好,
输出不相等的数即可,基本结构如下:
for(i=0;i<n+m-1;i++)
for(j=0;j<n+m-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
printf("%d",a[0]);
for(i=1;i<m+n;i++)
{
if(a[i]!=a[i-1])
printf(" %d",a[i]);
}
判断两个数之间的完数:
for(i=m1>m2?m2:m1;i<=(m1>m2?m1:m2);i++)
{
s=0;
for(j=1;j<i;j++)
if(i%j==0)
s=s+j;
if(s==i)
sum++;
}
Problem 1339题,最经典的一部分就是把式子n=o*2^p转化为C语言问题程序如下:
while(n%2==0)
{
p++;
n/=2;
}
输入一个字符串按逆序输出:(注意字符串的输入这里i取零)
for(i=strlen(s)-1;i>=0;i--)
{
if(s[i]=='0')
{
q=q+1;
}
else
break;
}
if(s[0]=='-')
{
printf("-");
for(h=i;h>=1;h--)
printf("%c",s[h]);
for(i=0;i<q;i++)
printf("0");
printf("\n");
}
else
{
for(h=i;h>=0;h--)
printf("%c",s[h]);
for(i=0;i<q;i++)
printf("0");
printf("\n");
}
用N个三角形最多可以把平面分成几个区域?(输入N,规律如下:2+3*N*(N-1))
输入一个数,求这个数的展开式:(利用数组基本程序如下)
for(k=2;k<=a;k++)
{
while(n%k==0)
{
n=n/k;
s[h++]=k;
}
}
for(i=0;i<h;i++)
{
if(i<h-1)
printf("%d*",s[i]);
else
printf("%d\n",s[i]);
}
输入一个数找出这个数在这几个数中最小的约数:(简称背包问题)
while(n--)
{
scanf("%d",&a);
x=a/350;
y=a/200;
z=a/150;
b=a;
for(i=0;i<=x;i++)
{
for(j=0;j<=y;j++)
{
for(k=0;k<=z;k++)
{
c=a-(350*i+200*j+150*k);
if(c>=0)
{
if(c<b)
b=c;
}
}
}
}
printf("%d\n",b);
对于一些程序边输入边记录下面这个结构很好:
while(n--)
{
cin>>s>>p;
if(p>=90) sum+=s,quan+=s*4;
else if(p>=80&&p<90) sum+=s,quan+=s*3;
else if(p>=70&&p<80) sum+=s,quan+=s*2;
else if(p>=60&&p<70) sum+=s,quan+=s*1;
else if(p>=0&&p<60) sum+=s,quan+=s*0;
else k++;
}
求大数的余数阶乘:
b=0;
memset(p,0,sizeof(p));
scanf("%I64d",&a);
b=a;
p[1]=a%10;
p[2]=(p[1]*a)%10;
p[3]=(p[2]*a)%10;
p[0]=(p[3]*a)%10;
if(b>=4)
b=b%4;
比较n个数中出现次数最多的那个数并输出:
scanf("%d",&b);
if(a==0)
{
c=b;
a=1;
}
else
{
if(b==c)
a++;
else
a--;
}
字符串的比较问题:(这里引用了二维数组来记录字符串的位置,另一个一维数组的 双重用法是要理解记忆:堪称经典)
for(i=0,max=0;i<n;i++)
{
for(j=i+1,a[i]=0;j<n;j++)
{
if(strcmp(s[i],s[j])==0)
a[i]++;
}
if(a[i]>max)
max=a[i];
}
for(i=0;i<n;i++)
{
if(a[i]==max)
puts(s[i]);
}
卡片问题:
for(int i=0;i<n;i++) queue[i]=i+1;(初始化队列)
front=0;
rear=n;
while(front<rear)
{
printf(" %d",queue[front++]);(输出并抛弃队首元素)
queue[rear++]=queue[front++];(队首元素转移到队尾)
}
素数的判定问题:
int is_prime(int n)
{
for(int i=2;i*i<=n;i++)
if(n%i==0) return 0;
return 1;
}
排序方法:
for(i=0;i<b-1;i++)
for(j=0;j<b-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
冒泡法排序:
for(g=0;g<t;g++)
for(h=(g+1);h<t;h++)
{
if(c[g]>c[h])
{
temp=c[g];
c[g]=c[h];
c[h]=temp;
}
}
面积公式:
S = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) )
http://61.153.148.216/acm/main.jsp
求公约数经典函数:
int gcd(int m,int n)
{
if(n==0)
return m;
gcd(n,m%n);
}
阶乘的精确值:
f[0]=1;
for(i=2;i<=n;i++)
{
int c=0;
for(j=0;j<maxn;j++)
{
int s=f[j]*i+c;
f[j]=s%10;
c=s/10;
}
对于一些有规律的题目,应该多写出几项找其规律,比如说 Fibonacci数列的一些问题
要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法):
__int64 d[51]={0,3,6,6};
for(i=4;i<51;i++)
d[i]=d[i-1]+2*d[i-2];
蜂房问题:(蜜蜂的行走路径)
__int64 num[101]={1,1,2};
for(i=3;i<100;i++)
num[i]=num[i-1]+num[i-2];
拿走当时羊的一半,然后退还一只:
f[i]=(f[i-1]-1)*2;
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法:
b[i+1]=b[i-1]+b[i];
给你几个点的坐标计算,这几个点所围图形的面积:
scanf("%d%d", &a[i], &b[i]); i++;}
for (i = 0; i < p - 1; i++)
c = c + 0.5*(a[i] * b[i + 1] - a[i + 1] * b[i]);
c = c + 0.5*(a[p-1] * b[0] - a[0] * b[p-1]);
统计给定文本文件中汉字的个数:
while(n--)
{
count=0;
while((c=getchar())!='\n')
{
if(c<0)
count++;
}
printf("%d\n",count/2);
求n个数的最小公倍数:
for(j=2;j<9999999999;j++)
{
c=0;
for(i=0;i<n;i++)
{
if(j%a[i]==0) c++;
}
if(c==n)
{
printf("%d\n",j);
break;
}
输出一个字符串中最大字符(需要中间变量的参与,才能更好的表现出来:这里的max用的很漂亮)
for(i=1;i<l;i++)
{
if(a[i]>=max)
{
max=a[i];
}
}
for (i = 0 ; a[i] ; i++)
{
putchar(a[i]);
if (a[i] == max)
printf("%s", "(max)");
}
满足合法字符的条件:
if((a[0]>='A'&&a[0]<='Z')||(a[0]>='a'&&a[0]<='z')||a[0]=='_')x++;
整数的取余问题(如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?)
for(i=1;i<=n;i++)
{
scanf("%d",&a);
sum+=a/100;
a=a%100;
sum=sum+a/50;
a=a%50;
sum=sum+a/10;
a=a%10;
sum=sum+a/5;
a=a%5;
sum=sum+a/2;
a=a%2;
sum=sum+a/1;
}
按绝对值由大到小的顺序输出:(问题不要想得太复杂)
for(i=0;i<n;i++)
for(j=i;j<n;j++)
{
if(fabs(a[j])>fabs(a[i]))
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数:(数列的追踪)
min=a[1];
for(i=2;i<=n;i++)
{
if(min>a[i])
{
min=a[i];
c=i;
}
}
a[c]=min;
t=a[1];
a[1]=a[c];
a[c]=t;
比较三个字符之间的大小顺序,并按大小顺序输出:
x=a>b?(a>c?a:c):(b>c?b:c);
y=a<b?(a<c?a:c):(b<c?b:c);
z=a+b+c-x-y;
输入一列数(有的数相同,有的数相同有的不同),按照由小到大的顺序输出,(没有重复的数):基本思路就是,先按大小顺序排好,
输出不相等的数即可,基本结构如下:
for(i=0;i<n+m-1;i++)
for(j=0;j<n+m-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
printf("%d",a[0]);
for(i=1;i<m+n;i++)
{
if(a[i]!=a[i-1])
printf(" %d",a[i]);
}
判断两个数之间的完数:
for(i=m1>m2?m2:m1;i<=(m1>m2?m1:m2);i++)
{
s=0;
for(j=1;j<i;j++)
if(i%j==0)
s=s+j;
if(s==i)
sum++;
}
Problem 1339题,最经典的一部分就是把式子n=o*2^p转化为C语言问题程序如下:
while(n%2==0)
{
p++;
n/=2;
}
输入一个字符串按逆序输出:(注意字符串的输入这里i取零)
for(i=strlen(s)-1;i>=0;i--)
{
if(s[i]=='0')
{
q=q+1;
}
else
break;
}
if(s[0]=='-')
{
printf("-");
for(h=i;h>=1;h--)
printf("%c",s[h]);
for(i=0;i<q;i++)
printf("0");
printf("\n");
}
else
{
for(h=i;h>=0;h--)
printf("%c",s[h]);
for(i=0;i<q;i++)
printf("0");
printf("\n");
}
用N个三角形最多可以把平面分成几个区域?(输入N,规律如下:2+3*N*(N-1))
输入一个数,求这个数的展开式:(利用数组基本程序如下)
for(k=2;k<=a;k++)
{
while(n%k==0)
{
n=n/k;
s[h++]=k;
}
}
for(i=0;i<h;i++)
{
if(i<h-1)
printf("%d*",s[i]);
else
printf("%d\n",s[i]);
}
输入一个数找出这个数在这几个数中最小的约数:(简称背包问题)
while(n--)
{
scanf("%d",&a);
x=a/350;
y=a/200;
z=a/150;
b=a;
for(i=0;i<=x;i++)
{
for(j=0;j<=y;j++)
{
for(k=0;k<=z;k++)
{
c=a-(350*i+200*j+150*k);
if(c>=0)
{
if(c<b)
b=c;
}
}
}
}
printf("%d\n",b);
对于一些程序边输入边记录下面这个结构很好:
while(n--)
{
cin>>s>>p;
if(p>=90) sum+=s,quan+=s*4;
else if(p>=80&&p<90) sum+=s,quan+=s*3;
else if(p>=70&&p<80) sum+=s,quan+=s*2;
else if(p>=60&&p<70) sum+=s,quan+=s*1;
else if(p>=0&&p<60) sum+=s,quan+=s*0;
else k++;
}
求大数的余数阶乘:
b=0;
memset(p,0,sizeof(p));
scanf("%I64d",&a);
b=a;
p[1]=a%10;
p[2]=(p[1]*a)%10;
p[3]=(p[2]*a)%10;
p[0]=(p[3]*a)%10;
if(b>=4)
b=b%4;
比较n个数中出现次数最多的那个数并输出:
scanf("%d",&b);
if(a==0)
{
c=b;
a=1;
}
else
{
if(b==c)
a++;
else
a--;
}
字符串的比较问题:(这里引用了二维数组来记录字符串的位置,另一个一维数组的 双重用法是要理解记忆:堪称经典)
for(i=0,max=0;i<n;i++)
{
for(j=i+1,a[i]=0;j<n;j++)
{
if(strcmp(s[i],s[j])==0)
a[i]++;
}
if(a[i]>max)
max=a[i];
}
for(i=0;i<n;i++)
{
if(a[i]==max)
puts(s[i]);
}
卡片问题:
for(int i=0;i<n;i++) queue[i]=i+1;(初始化队列)
front=0;
rear=n;
while(front<rear)
{
printf(" %d",queue[front++]);(输出并抛弃队首元素)
queue[rear++]=queue[front++];(队首元素转移到队尾)
}
素数的判定问题:
int is_prime(int n)
{
for(int i=2;i*i<=n;i++)
if(n%i==0) return 0;
return 1;
}
排序方法:
for(i=0;i<b-1;i++)
for(j=0;j<b-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
冒泡法排序:
for(g=0;g<t;g++)
for(h=(g+1);h<t;h++)
{
if(c[g]>c[h])
{
temp=c[g];
c[g]=c[h];
c[h]=temp;
}
}
面积公式:
S = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) )
http://61.153.148.216/acm/main.jsp
求公约数经典函数:
int gcd(int m,int n)
{
if(n==0)
return m;
gcd(n,m%n);
}
阶乘的精确值:
f[0]=1;
for(i=2;i<=n;i++)
{
int c=0;
for(j=0;j<maxn;j++)
{
int s=f[j]*i+c;
f[j]=s%10;
c=s/10;
}
对于一些有规律的题目,应该多写出几项找其规律,比如说 Fibonacci数列的一些问题