请教一个C语言的问题

孤狼墨羽 发布于 2016/06/01 20:49
阅读 298
收藏 0

@学PHP的小蚂蚁 你好,想跟你请教个问题:

1.       输入n(正整数,2位数),计算nn次方的后3位数字。

#include <stdio.h>
#include <math.h>
main()
{
    int  n=0, a, b, c;
    float z=0;
    printf("请输入一个两位整数:\n");
    scanf("%d", &n);
    z = pow (n,n);
    a =  z/100%10;
    b = z/10%10;
    c = z%10;
    printf("%lf\n", z);
    printf("%d%d%d",a,b,c);
    return 0;
}

这是我编的一个代码,我想请教的是后三位的那个问题怎么解决,我的abc三个用z不能整除的?

谢谢!!!

加载中
0
乌合之众
乌合之众

z是一个float类型的数,其与int型的数运算的结果还是float型。而float类型不能求余。

试试下面的代码,是基于你的改的,效率比较低一点

#include <stdio.h>
#include <math.h>
int main()
{
    int  n=0;
    double z=0;
    printf("请输入一个两位整数:\n");
    scanf("%d", &n);
    z = pow (n,n);
    while(z >= 1000){
    	z-=1000;
    }
    n = z;
    printf("%lf\n", z);
    printf("%03d",n);
    return 0;
}



孤狼墨羽
孤狼墨羽
您好!谢谢您的回答。不过这个程序在我这只能运行11,还有while里面的东西我没懂什么意思?
0
xpbob
xpbob
我的感觉是你只要后3位,用int类型就行,反正上溢之后并不会改变后3位数,然后直接取出最后3位就行,也可以取出二进制的后10位,2的10次刚好过千,然后分离
木兰宿莽
木兰宿莽
有道理
0
乌龟壳
乌龟壳
#include <stdio.h>

int main()
{
    unsigned int n, i, j;
    printf("integer: ");
    scanf("%d", &n);

    j = n;
    for (i = 1; i < n; i++) {
        j *= n;
        j %= 1000;
    }

    printf("%03d\r\n", j);
}
tuzhao
tuzhao
回复 @乌龟壳 : 恩,现在是对的. 我用java也计算了下,结果和你的是一样的.你能看看我写的,为什么输入17开始就计算的不准确了呢?
乌龟壳
乌龟壳
回复 @tuzhao : 已经修改好了
乌龟壳
乌龟壳
结果是000,没打全
tuzhao
tuzhao
回复 @乌龟壳 : 为什么我运行你这个程序不对呢?你输入一个10 试下
乌龟壳
乌龟壳
回复 @tuzhao : 题目只要最后三位,高位溢出就溢出呗。如果真要把所有值都算出来,只能用大数运算了,复杂度和这个不是一个级别的。
下一页
0
tuzhao
tuzhao
#include<stdio.h>
#include<math.h>
#include<string.h>

int main(){

	int a=0;
	double n=0;

	printf("double size is:%ld\n",sizeof(n));

	printf("please input an int value:\n");
	scanf("%d",&a);

	printf("get intput is :%d\n",a);

	if(a>100){
		printf("\n");
		printf("-------------------------------\n");
		printf("the input value must be <100!!!\n");
		printf("-------------------------------\n");
		printf("\n");
		return -1;
	}


	n=pow(a,a);

	printf("cacul result is:%lf\n",n);


	char str[512];
	int j=0;
	for(j=0;j<256;j++){
		str[j]='a';
	}

	sprintf(str,"%lf",n);
	printf("get str is:%s\n",str);


	printf("without point . is:");
	int index=0;
	int i=0;
	for(i=0;i<256;i++){
		if((str[i]>='0')&&(str[i]<='9'))
			printf("%c",str[i]);
		else{
				index=i;
				break;
		}
	}

	printf("\n");
		
	printf("point . index is:%d\n",index);

		
	if(index>=3){
		printf("last three value is:");
		int k=index-3;
		for(;k<index;k++)
				printf("%c",str[k]);
		printf("\n");
	}else{
		int g=n;
		printf("last three value is:%d\n",g);
	}

	return 0;
}



乌龟壳
乌龟壳
这题就不能用pow,数值太大了
tuzhao
tuzhao
回复 @孤狼墨羽 : 我刚运行了下,我这个程序输入16是正常的,但是输入17就计算的不准确了,我也不知道为什么...
tuzhao
tuzhao
回复 @孤狼墨羽 : 我这边运行正常的啊,
tuzhao
tuzhao
回复 @孤狼墨羽 : get intput is :16 cacul result is:18446744073709551616.000000 get str is:18446744073709551616.000000 without point . is:18446744073709551616 point . index is:20 last three value is:616
孤狼墨羽
孤狼墨羽
这个输入16以上就都是000了
0
tuzhao
tuzhao
/**
     * @param num1
     * @param num2
     * @param c    +     -     *     /      ^  (加  减  乘  除  幂)
     * @return result
     */
    public static String getBigNumCalculate(String num1, String num2, char c) {
        BigDecimal b1 = new BigDecimal(num1);
        BigDecimal b2 = new BigDecimal(num2);
        BigDecimal result = null;
        switch (c) {
        case '+':
            result = b1.add(b2);
            break;
        case '-':
            result = b1.subtract(b2);
            break;
        case '*':
            result = b1.multiply(b2);
            break;
        case '/':
            result = b1.divide(b2);
            break;
        case '^':
            int i = Integer.parseInt(num2);
            if (i>=1) {
                for (int k = 0; k < i-1; k++) {
                    b1 = b1.multiply(b2);
                }
            }
            result = b1;
            break;
        default:
            break;
        }
        if (result == null) {
            return "";
        } else {
            return result.toString();
        }

    }



乌龟壳
乌龟壳
这就是我之前说的大数运算,里面实际算法比较复杂
返回顶部
顶部