ACM选修课1 数学问题

news/2024/5/19 21:29:06 标签: c++, 算法, c语言, 快速排序

算法基本知识

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;
}

http://www.niftyadmin.cn/n/816066.html

相关文章

ACM选修课2 排序问题

基本编程知识 当一个表达式对一个数取余的时候大概率存在周期&#xff0c;一般在三倍取模的数之内 (ab)%c(a%cb%c)%c (ab)%c((a%c)(b%c))%c ab%c(a%c)b%c 例题 排序 #include <bits/stdc.h> using namespace std; int main() {int a[15];//定义成long long用sort会出…

ACM选修课3 递归

递归算法 定义&#xff1a;自己调用自己&#xff08;需要调用栈来执行&#xff09; 两个基本要素&#xff1a;边界条件&#xff08;何时结束&#xff09;和 递归模式&#xff08;大问题如何转化为小问题&#xff09; 关键&#xff1a;根据递推关系式写程序&#xff08;用数学归…

ACM选修课4 高精度

高精度算法 stirling公式&#xff1a;n&#xff01;~ (n/e)n(2*pai*n)1/2^ &#xff08;n趋向正无穷成立 当n大于100时可用&#xff09; 例题 初等算数 #include <bits/stdc.h> using namespace std; int main() {long long int a,b;while(cin>>a>>b){if…

数据结构 单链表总结(c/c++)

有关动态内存分配的函数 1、malloc函数 函数原型为void *malloc(unsigned int size); 作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的值&#xff08;即“返回值”&#xff09;是一个指向分配域起始地址的针&#xff08;类型为void&#xff09;。如果此函数…

ACM选修课5 贪心法

贪心法 部分最优&#xff0c;结果最优&#xff08;需证明&#xff09; 贪心问题的特征&#xff1a; 1、一个问题的最优解包含其子问题的最优解 2、整体最优解可以通过局部的最优的选择 例题 老鼠的旅行 #include <bits/stdc.h> using namespace std; struct sa {int…

ACM选修课6 二分法与构造矩阵

二分法 lower_bound()返回值是一个迭代器,返回指向大于key的第一个值的位置 使用&#xff1a;lower_bound(a,a8,key)-a upper_bound()返回值是一个迭代器,返回指向大于等于key的第一个值的位置 使用&#xff1a;upper_bound(a,a8,key)-a 例题 二分查找 #include <bits/…

数据结构 建立单调有序链表

方法一&#xff1a;先建立链表&#xff0c;后对链表进行排序 #include <stdio.h> #include <stdlib.h> typedef struct LNode {int data;struct LNode *next; }; void creatListH(struct LNode *head, int n);//创建链表 void print(struct LNode *head);//输出链…

Washall算法

Washall算法可由一个图的邻接矩阵求它的可达矩阵,形式上很简单,就是一个三层循环, 问题引出&#xff1a;在一个图结构中&#xff0c;常常需要找两个节点之间有没有一条通路&#xff08;通路长任意&#xff09;&#xff0c;也就是任意两点之间的可达情况&#xff0c;我们很自然…