程序大全,吐血总结,围板必究,哈哈

涂色问题:(有排成一行的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数列的一些问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值