| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3852 人关注过本帖, 4 人收藏
标题:几个适合新人练习的小问题,有兴趣的试试。大神还是绕道吧。
只看楼主 加入收藏
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
回复 10楼 书生牛犊
第五题:最后两位数实际上是一个循环。
这里分开问也就是想提醒大伙存在这么一个循环。个位数只存在2,4,6,8这4个数值。同理,最后两位数也存在类似的一个循环。
当然,你说的方法适合不同整数的N次方取最后两位的运算。
通过这题,就是想说。往往看适复杂的东西,只要你理解它的规则,其实它并不难。

[此贴子已经被作者于2016-11-4 09:46编辑过]

2016-11-04 09:42
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 11楼 linlulu001
都是乘以二,所以出现循环是理所当然了。。。如果是乘以11,乘以34,乘以125,这个时候还能轻易看出最后两位数的循环了吗?

不能吧,或许依然会有循环,只不过这个循环应该会拉得比较长。毕竟我们不是在做奥赛,我个人还是比较推荐写个程序让他跑循环去。
-----------------------------------
第二题的题目可能存在bug,计算3000的阶乘,这个数字的长度得有多少位啊。。我估计一般的数组都塞不下。。应该大约可能也就计算最低的若干位比较合适吧。。


[此贴子已经被作者于2016-11-4 09:55编辑过]


φ(゜▽゜*)♪
2016-11-04 09:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:15 
以下是引用书生牛犊在2016-11-4 09:27:44的发言:

5.2的1992次方的个位和十位上的数分别是几 = 2的1991次方的最低两位数,乘以2 = 2的1990次方的最低两位数,乘以2*2 =  ...
用这样的思考方式我们可以计算出任意自然数m的任意次方n的最低k位(m,n,k均为正整数)
可以用 快速幂 算法

仅就这题而言,可以直接查表
程序代码:
#include <stdio.h>

inline int foo( int n )
{
    static const int map[] = { 1,2,4,8,16,32,64,28,56,12,24,48,96,92,84,68,36,72,44,88,76,52 };
    return map[(n-2)%20+2];
}

int main( void )
{
    printf( "%02d\n", foo(1992) );
}



收到的鲜花
  • linlulu0012016-11-04 10:30 送鲜花  10朵   附言:正解
2016-11-04 10:18
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
回复 12楼 书生牛犊
M的N次方,它存在这样的循环,最后取的位数越多,循环拉的越长,个人觉得取最后两位还算合理。不论笔算还是用计算器算都在可接受范围。
3000的阶乘可以放的下。
这里最好用动态数组来处理,可以通过斯特林公式计算log10(2*PI*n)/2+n*log10(n/E)+1,为了保证能放的下将公式小小的修改一下log10(2*PI*n)+n*log10(n)+1;
其实只要能算到百个数位,那么百万个数位只不过就是存放的空间大小不一样而已。

[此贴子已经被作者于2016-11-4 10:59编辑过]

2016-11-04 10:28
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
# define PI 3.141592654
using namespace std;
int M;
void f(int n)
{
  M=log10(2*PI*n)+n*log10(n)+1;        //位数计算
  /*标准公式:log10(2*PI*n)/2+n*log10(n/E)+1,E的值是2.71828182846*/
}

void fun(int n)
{   
      int *result =NULL;
      result=(int *)calloc(M,sizeof(int));     
      result[0]=1;      
      int number_count=1;//位数     
      int number_carry=0;//进位     
      int number_temp=0;//临时值     
      for(int i=1;i<=n;i++)     
      {
           for(int j=0;j<number_count;j++)         
           {              
                   number_temp=result[j]*i+number_carry;            
                   result[j]=number_temp%10;            
                number_carry=number_temp/10;         
            }         
            while(number_carry)         
            {              
                result[number_count]=number_carry%10;            
                number_carry=number_carry/10;            
                number_count++;         
            }     
        }      
        for(int i=number_count-1;i>=0;--i)         
            printf("%d",result[i]);     
            printf("\n");     
            free(result);
}

int main()
{     
    int n;     
    while(scanf("%d",&n))     
    {         
        if(n==0)              
        printf("1\n");         
        else            
        {
            f(n);
            fun(n);  
        }   
    }     
    return 0;
}
N阶乘的代码,输入非数字退出
2016-11-04 11:30
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
针对第五题, 可不可以这样来
既然是求最后的个位和十位数
那么只要每次结果对100取余,
每次得到一个两位数,循环1991次
收到的鲜花
  • 九转星河2016-11-04 13:09 送鲜花  5朵   附言:我很赞同

早知做人那么辛苦!  当初不应该下凡
2016-11-04 11:38
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 16楼 炎天
我就是这样想的,正解。
不过这样运算没有快速幂快。我算了一下,两位数每20次方一个循环。最后只要把1992%20再直接计算就行了。
两种方法都可行,前者较为直接,后者较为迅速。

[此贴子已经被作者于2016-11-4 13:12编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-04 13:08
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:15 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    srand((unsigned)time(NULL));
    char ch=0;
    int comp=0;
    int man=0;
    char * s[]={"石头","剪子",""};
    while(1)
    {
        fflush(stdin);
        system("cls");
        printf("请选择你要出的拳头:\n");
        printf("A:石头\n");
        printf("B:剪子\n");
        printf("C:布\n");
        printf("D:退出\n");
        scanf("%c",&ch);
        if(ch=='d' || ch=='D') break;
        comp=rand()%3;
        if(ch=='a' || ch=='A') man=0;
        if(ch=='b' || ch=='B') man=1;
        if(ch=='c' || ch=='C') man=2;
        if(comp-man==0) printf("电脑出的是%s  平局\n",s[comp]);
        if((comp-man==-1) || (comp-man==2)) printf("电脑出的是%s  电脑胜出\n",s[comp]);
        if((comp-man==1) || (comp-man==-2)) printf("电脑出的是%s  楼主胜出\n",s[comp]);
        system("pause");
    }
    return 0;
}


[此贴子已经被作者于2016-11-4 14:42编辑过]

收到的鲜花
  • linlulu0012016-11-04 15:45 送鲜花  10朵  

DO IT YOURSELF !
2016-11-04 14:22
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    int computer,gamer,result;
    char k;
    printf("这是一个猜拳的小游戏,请输入你要出的拳头:\n");
    while(1)
    {         
        printf("A:剪刀\nB:石头\nC:布\nD:不玩了\n");
        srand((unsigned)time(NULL));
        computer=rand()%3;
        scanf(" %c",&k);
        //getchar();
        if(k==65||k==97) gamer=4;
        else if(k==66||k==98) gamer=7;
        else if(k==67||k==99) gamer=10;
        else if(k==68||k==100)  return 0;
        printf("电脑出了");
         switch (computer)
        {
            case 0:printf("剪刀\n");break;
            case 1:printf("石头\n");break;
            case 2:printf("布\n");break;  
        }
        printf("你出了");
        switch (gamer)
        {
            case 4 :printf("剪刀\n");break;
            case 7 :printf("石头\n");break;
            case 10:printf("布\n");break;  
        }
        result=gamer+computer;
        if (result==6||result==7||result==11) printf("你赢了!\n");
        else if (result==5||result==9||result==10) printf("电脑赢了!\n");
        else printf("平手\n");
        system("pause>nul&&cls");         
    }
    return 0;   
}
猜拳游戏代码。
和楼上的大神方法类似。写法不同。

[此贴子已经被作者于2016-11-4 15:52编辑过]

2016-11-04 15:49
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
你确认这个 //getchar(); 不吃回车 没问题吗  

DO IT YOURSELF !
2016-11-04 15:55
快速回复:几个适合新人练习的小问题,有兴趣的试试。大神还是绕道吧。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029446 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved