c语言整数超出unsigned long long的表示范围该怎么办

问题描述

c语言整数超出unsigned long long的表示范围该怎么办
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<limits.h>

unsigned long long number(int n);
int main(void)
{
    int num;

    printf("你要计算第几个数? (q to quit):n");
    while (scanf("%d", &num) == 1)
    {
        if (num < 0)
            printf("无效的数字n");
        else
        {
            printf("第%d 个数是%llun", num, number(num));
        }
        printf(" 输入一个0-100的整数 (q to quit):n ");
        printf("可以表示的最大的数为%llun", ULLONG_MAX);
    }
    return 0;
}
unsigned long long number(int n)
{
    unsigned  long long x1 = 0, x2 = 1, xn = 0;
    if (n < 3)
        xn = 1;
    else
        for (int i = 2; i <= n; ++i)
        {
            xn = x1 + x2;
            x1 = x2;
            x2 = xn;
        }
        return xn;
}

上面的程序计算斐波那契数列的第97项时就已经溢出了,如果要求第100项、第10000项。。。。。该怎么办?

解决方案

用字符串模拟四则运算实现大数计算。或者用double求约略数。

解决方案二:

1.在64位系统上,unsigned long long是8个字节,和unsigned long 一样;
2.如果unsigned long long溢出了,可以这么处理,起始就是自己实现16字节的整数,如果还不够,类似方法实现24,32字节整数:
unsigned long long high;
unsigned long long low;
low表示底8字节,high表示高8字节,如果low溢出了,就high ++

解决方案三:

用高精度来处理大数,矩阵乘法和快速幂解决n较大的情况

时间: 2024-09-30 19:32:38

c语言整数超出unsigned long long的表示范围该怎么办的相关文章

c语言-C语言整数转字符串输出

问题描述 C语言整数转字符串输出 #include #include void to_str(n)int n;{ char s[10]; int i = 0; if(n { putchar('-'); n = -n; } do { s[i++] = n%10 +'0'; n/=10; } while(n>0); while(i--)putchar(s[i]);}main(){ int xy; scanf(""%d""&x); to_str(x);}这里

基于C语言char与unsigned char的区别介绍_C 语言

在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别. 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种有什么区别呢?主要是符号位,但是在普通的赋值,读写文

CString,字符串,整数等相互转换方法(推荐)_C 语言

字符串转int int atoi(const char *string); _int64 _atoi64(const char *string); int _wtoi(const wchar_t *string); _int64 _ wtoi64(const char *string); 字符串转long long atol(const char * string); long _wtol(const wchar_t *string); 字符串转double double atof(const

C程序实现整数的素数和分解问题_C 语言

本文以实例形式讲述了C程序实现整数的素数和分解问题,分享给大家供大家参考之用.具体方法如下: 要求:对于一个给定的整数,输出所有这种素数的和分解式,对于同构的分解只输出一次(比如5只有一个分解2+3,而3+2是2+3的同构分解式). 例如: 对于整数8,可以作为如下三种分解: (1) 8 = 2 + 2 + 2 + 2 (2) 8 = 2 + 3 + 3 (3) 8 = 3 + 5   看到此题时,我的头一反应是求解背包问题 思路如下: f(N, array) = f(N - array[i],

C++中几种将整数转换成二进制输出的方法总结_C 语言

看<编程之美>第二节的时候,它是定义的一个整型,然后取位.但是他的那个或运算符号好像写错了,写成了异或符号"^",应该是"|".我就突然对二进制的输出感兴趣了.想知道怎样输出二进制.我们知道C++输出十六进制是cout〈〈hex〈〈 a:而八进制是cout〈〈 ocx〈〈 a;二进制则没有默认的输出格式,需要自己写函数进行转换,于是上网搜索了一下.网上思路真是广泛啊. 下面列出一些方法.  #include 〈iostream〉 #include 〈li

C 语言基础教程(我的C之旅开始了)[四]_C 语言

10. 基本数据类型:整型(上) 1. 整型 int     C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int 是整型之一,一般被称为整型.    int 代表有符号整数,也就是说,用 int 声明的变量可以是正数,可以是负数,也可以是零,但是只能是整数.标准规定 int 的最小取值范围是 -32767 到 32767.int 的取值范围因机器而异,但是一定要大于或者等于-32767到 32767.一般来说,int 占用一个字的内存空间.因此,

c 语言 51 字节 扩展-C语言有没有一种简单的运算进行字节扩展?

问题描述 C语言有没有一种简单的运算进行字节扩展? 在C语言中有没有一种简单的办法扩展字节? 比如 8位的10101010 扩展为16位1100110011001100应该如何实现? 解决方案 char *itoa(int value, char *string, int radix); 我记得这个函数可以 解决方案二: 这是要定义一个"函数",输入是清楚的:一个字节,即unsigned char类型: 输出是什么?一个双字节整数(unsigned short)? 映射规则是什么? -

浅析C语言中strtol()函数与strtoul()函数的用法_C 语言

C语言strtol()函数:将字符串转换成long(长整型数)头文件: #include <stdlib.h> strtol() 函数用来将字符串转换为长整型数(long),其原型为: long int strtol (const char* str, char** endptr, int base); [参数说明]str 为要转换的字符串,endstr 为第一个不能转换的字符的指针,base 为字符串 str 所采用的进制. [函数说明]strtol() 会将参数 str 字符串根据参数 b

Java实现基于栈实现整数加法算法

整数是有最大上限的,如果整数超出最大上限位数,如 4398912120931092319+49832232849329019019210921029,此时整型变量无法保存这些数字.解 决的办法是,可利用字符串保存这些数字,再利用栈做按位加法. 1.用Java实现,首先使用链表LinkedList构造栈数据结构. import java.util.LinkedList; public class IntStack { private LinkedList<Integer> storage = n