ACM选修课1 数学问题

算法基本知识

memset()函数:memset(数组名,1/0/-1,sizeof(a)),重置为1是数组为任意正数
求一个数的位数:(int)log10(n)+1,公式log10(i),i 必须为double类型

例题

The Hardest Problem Ever

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char a[300],b[300];
    int i;
    while(gets(a))
    {
        if(strcmp(a,"STARE")==0)
            memset(b,0,sizeof(b));
        else if(strcmp(a,"END")==0)
            printf("%s\n",b);
        else if(strcmp(a,"ENDOFINPUT")==0)
            break;
        else
        {
            for(i=0; a[i]!='\0'; i++)
            {
                if(a[i]>='A'&&a[i]<='Z')
                {
                    if(a[i]+21>90)//加密方式给定 可以简单处理
                        b[i]=a[i]-5;
                    else
                        b[i]=a[i]+21;
                }
                else
                    b[i]=a[i];
            }
        }
    }
    return 0;
}

Rightmost Digit

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    int a[10][4]= {{0},{1},{6,2,4,8},{1,3,9,7},{6,4},{5},{6},{1,7,9,3},{6,8,4,2},{1,9}};
    //由末尾数字与自身相乘可到到相乘的规律
    while(n--)
    {
        long long int m;
        scanf("%ld",&m);
        int d=m%10;
        if(d==0||d==1||d==5||d==6)
            printf("%d\n",d);
        else if(d==4||d==9)
            printf("%d\n",a[d][m%2]);
        else if(d==2||d==3||d==7||d==8)
            printf("%d\n",a[d][m%4]);
    }
    return 0;
}
//另一种更加直接的方法是使用快速幂

数的长度

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long int n;
    while(cin>>n)
    {
        double res=0;
        for(long long int i=1; i<=n; i++)
            res=res+log10(i);//推出数学公式
        printf("%ld\n",(long long int)res+1);
    }
    return 0;
}

最左边的数
此题同样需要推数学公式,直接暴力时间太长且数据太大无法存放,推理过程如下:
1、nn = d.xxx * 10 (k-1),其中k表示nn的位数
2、等式两边取以10为底的对数得么d.xxx = 10(log10(nn)-(k-1))
3、带入k得计算公式k = log10(nn)的整数部分+1 = (int)log10(nn)+1
4、得到d得表达式 (int)(10(log10(nn)-(int)log10(nn))

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t,n;
    double x=0.0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        x=n*log10(n*1.0);
        x=x-(long long)x;
        x=(int)pow(10,x);
        printf("%ld\n",(long long int)x);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46126537/article/details/105231873
今日推荐