C语言实战

一、计算n的m次方(理论上只需要更改数组result[...]的元素个数,可以输出无穷大的结果)

#include<stdio.h>

#define ULLONG (unsigned long long)1000000000000000000ULL

int main(){
	
	int n;
	int m;
	int cc=0;   //监控循环次数
	unsigned long long result[10] = {1,0,0,0,0,0,0,0,0,0};
	printf("\n\n     ");
	printf("输入两个数 N 和 M,系统将计算 N 的 0 至 M 的次方:");
	scanf("%d  %d", &n, &m);
	
	for(int i=0;i<10;i++){
		
		while(cc<=m && result[i] < ULLONG){
			for(int j=0;j<i;j++){
			    result[j+1] = result[j+1] + result[j] / ULLONG;
			    result[j] = result[j] % ULLONG;			
			}
			printf("\n     ");
			printf(" %d 的 %-3d 次方是 %llu", n, cc, result[i]);
			for (int p = i; p > 0 ; p--) {
			    if (result[p-1] != 0) {
			        printf("%018llu", result[p-1]);
			    }
		    }
		    for(int g=0;g<i+1;g++){
				result[g]*=n;		
			}
			cc++;
		}	
	}
	
	return 0;
}

二、对每个k从1到n,分别统计1到k的所有数字的首位分布,然后将所有的1到k的首位数字分布累加,并输出

#include<stdio.h>

int main() {
    int Max = 10000;
    int base = Max + 1;
    //初始化结果数组为0,result的0到9分别代表首位数是0到9 
    int result[10] = {0}; 

    for (int d = 1; d <= 9; d++) { // 首位数字d从1到9
    // 当前位数基数(10^k),1代表1位数数字,2代表讨论2位数数字 
        long long power = 1; 
        while (1) {
            long long lower = d * power; // 当前区间下界
            if (lower > Max) break;

            long long upper = (d + 1) * power - 1; // 当前区间上界
            if (upper > Max) upper = Max;// 确保不超出Max

            long long n = upper - lower + 1;       // 区间内的数字个数
            // 当前区间对应的j值之和,等差数列求和,下面打个比分 
			//比如当区间是10到19时,10出现次数9990 11出现次数9909,19出现次数9981
			//所以当d=1,power=2时,求所有10到19的个数,就是等差求和 
            long long sum_j = n * ( (base - lower) + (base - upper) ) / 2;
            result[d] += sum_j; // 累加到对应首位

            if (upper == Max) break; // 已处理到最大值,退出循环
            power *= 10;             // 增加位数(扩大10倍)
        }
    }

    // 输出结果(0-9,其中0始终为0)
    for (int i = 0; i < 10; i++) {
        printf("%d\n", result[i]);
    }
    return 0;
}

image

posted @ 2024-06-10 22:23  黎野  阅读(18)  评论(0)    收藏  举报