一本书的页码从自然数1 开始顺序编码直到自然数n书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n 计算出书的全部页码中分别用到多少次数字0 1 2 …,9
编程任务 :
给定表示书的总页码的10 进制整数n (1≤n≤1000000000) 。编程计算书的全部页码中分别用到多少次数字0 1 2 …,9
数据输入 :
有m个输入数据,第1 行是m的个数,下m行给出表示书的总页码的整数n 。
结果输出:
输出有m行,在每行内输出页码中用到数字k-1 的次数,k=1 2 …,10 ,中间用空格分开。
输入样例:
2
5
11
输出样例:
1 1 1 1 1 0 0 0 0 0
1 4 1 1 1 1 1 1 1 1
运行时间限制30秒 运行内存限制8192K
2 问题描述 :
大于1 的正整数n 可以分解为:n=x1*x2*…*xm 。
例如,当n=12 时,共有8 种不同的分解式 :
12=12 ;
12=6*2 ;
12=4*3 ;
12=3*4 ;
12=3*2*2 ;
12=2*6 ;
12=2*3*2 ;
12=2*2*3 。
编程任务 :
对于给定的正整数n ,编程计算n 共有多少种不同的分解式 。
数据输入 :
有m个输入数据,第1 行是m的个数,下m行有1 个正整数n (1 ≤n ≤1000000)。
结果输出:
输出有m行,每行是计算出的不同的分解式数。
输入样例:
1
12
输出样例:
8
运行时间限制30秒 运行内存限制8192K
编程 09-08-15 四条棍99 发布
2个回答 时间 投票
0
一个人的颓废
1.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 2048 //若你有多于2048本书要计算,那后面就要申请内存了
void func(unsigned int (*ptr)[10], int m, int idx)
{
int i, j, h;
for (i=1; i<=m; ++i) {//这个for可以通过算法来提高效率,就是根据高位数字来得到低位出现的0-9的次数,累积就行了,算法很简单
j = i;
while (j > 0) {
++ptr[idx][j%10];
j /= 10;
}
}
}
int main()
{
unsigned int arr[2048][10] = {0}; //保存每本书的0-9次数
unsigned int (*ptr)[10] = 0;
unsigned int m[N], n;//m[N]保存每本书的页数
unsigned int *m_ptr;
unsigned int i;
printf("Input n (the lines of m): ");
scanf("%u", &n);
if (n > N) {//若书多于2048本,申请内存来保存
ptr = (unsigned int (*)[10])malloc(n*10*sizeof(unsigned int));
m_ptr = (unsigned int *)malloc(n*sizeof(unsigned int));
}
else {
ptr = arr;
m_ptr = m;
}
printf("Input %u numbers: ", n);
for (i=0; i<n; ++i) {
scanf("%u", m_ptr + i);
}
for (i=0; i<n; ++i) { // 跟上面的for分开,可以避免打扰编译器优化的输入缓冲,可以合到上面去.
func(ptr, m_ptr[i], i);
}
// 输出0-9
printf("number: %5u %5u %5u %5u %5u %5u %5u %5u %5u %5u\n", 0, 1, 2, 3, 4, 5, 6, 7, 8,
9);
for (i=0; i<n; ++i) { //输出每本书0-9的次数及总页数(有单页的书,这样的书真强大....)
printf("times: %5u %5u %5u %5u %5u %5u %5u %5u %5u %5u [Total pages: %5u]\
n", ptr[i][0], ptr[i][1], ptr[i][2], ptr[i][3], ptr[i][4], ptr[i][5], ptr[i][6], ptr[i][7], ptr
[i][8], ptr[i][9], m_ptr[i]);
}
if (ptr != arr) {
free(ptr);
free(m_ptr);
}
}