计算所有除b余c的n位数的和
来源:互联网 发布:java aws s3 下载文件 编辑:程序博客网 时间:2024/05/31 18:49
C代码如下:
/* * ===================================================================================== * * Filename: modnumsum.c * * Description: 计算被a除余b的units位数的总和 * * Version: 1.0 * Created: 2012年11月23日 21时14分57秒 * Revision: none * Compiler: gcc * * Author: Xingwang Su (http://blog.csdn.net/njzhiyuan) * Organization: * * ===================================================================================== */#include <stdio.h>#include <unistd.h>#include <getopt.h>#include <math.h>#include <stdlib.h>#include <sysexits.h>#include <libgen.h>long modnumsum(long divisor, long remainder, int units);void usage(char *program);int main(int argc, char *argv[]) {long divisor = 0; //除数long remainder = 0; //余数int units = 0; //被除数的位数int opt;const char *short_options = ":d:r:u:hv";const struct option long_options[] = {{"divisor", required_argument, NULL, 'd'},{"remainder", required_argument, NULL, 'r'},{"units", required_argument, NULL, 'u'},{"help", no_argument, NULL, 'h'},{"Version", no_argument, NULL, 'v'},{NULL, 0, NULL, 0}};while((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) {switch(opt) {case 'd':divisor = atol(optarg);break;case 'r':remainder = atol(optarg);break;case 'u':units = atoi(optarg);break;case 'h':usage(argv[0]);return EX_OK;break;case 'v':return EX_OK;break;case '?':fprintf(stderr, "Invalid option: -%c\n", optopt);return EX_USAGE;break;case ':':fprintf(stderr, "Option: -%c needs an agruments! \n", optopt);return EX_USAGE;break;default:return EX_USAGE;break;}}if (optind < argc) {fprintf(stderr, "Too many arguments! \n");return EX_USAGE;}if (divisor <= 0) {fprintf(stderr, "Invalid divisor: %ld\n", divisor);return EX_DATAERR;}if (units <= 0) {fprintf(stderr, "Invalid units: %d\n", units);return EX_DATAERR;}if (remainder < 0 || remainder > divisor) {fprintf(stderr, "Invalid remainder: %ld\n", remainder);return EX_DATAERR;}printf("The sum for %d figures which mod %ld equals %ld is %ld \n", units, divisor, remainder, modnumsum(divisor, remainder, units));return EX_OK;}long modnumsum(long divisor, long remainder, int units) {long dstart = pow(10, units - 1); //被除数的起始值long dend = dstart * 10 - 1; //被除数的结束值long sum = 0;long rtmp = 0;//计算第一个满足要求的被除数rtmp = dstart % divisor;dstart += rtmp <= remainder ? remainder - rtmp : divisor - (rtmp - remainder);//计算最后一个满足要求的被除数rtmp = dend % divisor;dend -= rtmp >= remainder ? rtmp - remainder : divisor - (remainder - rtmp);//等差数列求和,做了点特殊处理,尽可能地避免溢出dstart /= divisor;dend /= divisor;sum = (dstart + dend) * (dend - dstart + 1) / 2 * divisor + (dend - dstart + 1) * remainder;return sum;}void usage(char *program) {fprintf(stdout, "Usage:\n\t%s OPTIN\n", basename(program));}
执行:
$ gcc --version
gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright © 2012 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。
$ gcc -o modnumsum modnumsum.c -lm
$ ./modnumsum -u 4 -d 8 -r 5
The sum for 4 figures which mod 8 equals 5 is 6188625
- 计算所有除b余c的n位数的和
- 计算n!的位数
- c语言里的除和取余
- 计算n!的位数<Math>
- a的b次方的前N位数和后N位数
- 求1-n位数的所有数
- LeetCode:Counting Bits(高效计算n内所有数的置位数)
- 计算A^B的最后x位数
- /*求在100-1000之间所有能被4除余2 7除余3 9除余5的数之和*/
- 一个数被3除余2,被5除余3,被7除余2,求满足条件的前N个数
- 一个数被3除余2,被5除余3,被7除余2,求满足条件的前N个数
- 输出满足n=a!+b!+c!的所有三位数
- 给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过500位。
- 给出两个正整数A和B,计算A+B的值。保证A和B的位数不超过500位
- a^n - b^n 的计算方式
- 求[X,Y]内被除3余1并且被除5余3的整数的和
- 1166: 【求[X,Y]内被除3余1并且被除5余3的整数的和】
- 1057: 【求[X,Y]内被除3余1并且被除5余3的整数的和】
- 调试发行版程序 (二)
- 数据结构:线段树
- java jps 失效问题
- 无需第三方软件即可查询好友IP地址 (1)
- 调试发行版程序 (三)
- 计算所有除b余c的n位数的和
- 【mysql】mysql query cache配置与使用
- hdu 1061 Rightmost Digit
- Nand Flash 启动原理
- Visual C++线程同步技术剖析 (转载)
- 怎样将IP地址转换为数字
- 艾默生:默默消化在7.5亿美元并吞华为之后
- QQ如何查看对方IP
- 探索C++对象模型