获取任意位数各位;质(素)数、歌德巴赫、水仙数、完美数等均需取数之各位处理。

本文详细介绍了在C++与C#编程语言中如何处理数字的各位,包括转换、运算和内存管理。从基本的数字拆分到高级的内存操作,覆盖了诸如质数、歌德巴赫猜想、梅森质数、完美数等数学概念的实现,同时深入探讨了C#中获取数字各位的方法和C++中动态数组的使用。文章还涉及了数字处理的优化技巧,如利用循环和数学运算进行幕运算和多位数的处理。此外,提供了多种实现方式的对比,帮助读者理解不同编程语言的特点和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

质(素)数、歌德巴赫、水仙数、完美数等均需取数之各位处理。

            int 数字 = 369258147;/*质(素)数、歌德巴赫、梅森质数、完美数等均需取数之各位处理。*/
            int[] 位数组 = new int[数字.ToString().Length];/*获取任意位数各位。unchecked*/
            foreach (int 序 in Enumerable.Range(0, 位数组.Length))
                位数组[序] = int.Parse(数字.ToString()[序].ToString());
            /*虽然几经转换,处理语句简单多了。不知C#是否有指向内存地址来获取各位数值?*/

            int[] 位幕组 = Enumerable.Repeat(1, 位数组.Length).ToArray();
            foreach (int 幕 in Enumerable.Range(0, 3))/*数各位任意幕运算本例为3次幕。*/
                foreach (int 序 in Enumerable.Range(0, 位幕组.Length)) 位幕组[序] *= 位数组[序];
            Console.WriteLine(string.Join(" ", 位幕组));

            /*这样写和上述循环写法有多大区别?除了看起来语法简洁,少用几个变量外。*/
            int[] 位数组1 = 数字.ToString().ToCharArray().Select(类型转换 => int.Parse(类型转换.ToString())).ToArray();
            Console.WriteLine(string.Join(" ", 位数组1));
        int aa = 1234, bb = (int)Math.Pow(10, aa.ToString().Length - 1);
        Console.WriteLine(string.Join(" ", aa.ToString().ToCharArray()));
        do
        {
            Console.WriteLine(aa / bb);
            aa -= aa / bb * bb;
            bb /= 10;
        } while (aa > 0);


            Int64 输入数, 位 = 0;/*int32=10位,int64=19位(在32位机上int64=14位?)*/
            List<Int64> 动态位数 = new List<Int64>();
            Console.WriteLine("输入任意整数不超过指定 Int64 范围位数: ");
            输入数 = Int64.Parse(Console.ReadLine());
            do
            {
                动态位数.Add(输入数 % 10);
                输入数 /= 10;
                位++;
            } while (输入数 > 0);
            Console.WriteLine("输入数为: {0}位\n", 位);

            动态位数.Reverse();/*输出反转即可。*/
            Console.WriteLine(string.Join(" ", 动态位数));

            Int64[] 位组 = new Int64[位 - 1];
            Int64[] 位数 = new Int64[位];
            Int64 基 = 1;
            if (位 == 1) 位数[位 - 1] = 输入数;
            else
            {
                for (int 序 = 0; 位 - 1 != 序; 序++)
                {
                    基 *= 10;
                    位组[位 - 2 - 序] = 基;
                }
                for (int 序 = 0; 序 != 位 - 1; 序++)
                    Console.WriteLine("10的{0}幕{1}\n", 位 - 1 - 序, 位组[序]);

                基 = 输入数;
                for (int 序 = 0; 序 != 位 - 1; 序++)
                {
                    位数[序] = 基 / 位组[序];
                    基 %= 位组[序];
                    if (位组[序] == 10) if (基 <= 10) 位数[序 + 1] = 基;
                }
            }


	#define 数位32 10/*定义宏*/
	#define 数位64 14
	#define 数位64 19
	int 输入数(0), 位(0);
	cout << "输入任意整数不超过指定 Int 范围位数:10位" << endl;
	cin >> 输入数;
	int *动态 = new int();/*默认初始化0序值=0*/
	//int *动态 = new int(9);/*初始化0序值=9*/
	//int *动态 = new int[数位16];
	//int *动态 = new int[输入数];/*只有使用NEW才可以使用变量作为指定维数值*/
	do
	{
		动态[位++] = 输入数 % 10;/*后自增应用*/
		输入数 /= 10;
	} while (输入数 > 0);
	printf("输入数为: %d位\n", 位);
	for (int 序 = 位 - 1; 序 >= 0; 序--)
	printf("%d ", 动态[序]);
	delete 动态;/*在C++中使用NEW后就要配套使用DELETE来手动释放内存返回给系统,否则,将一直占用内存直到重启电脑.*/
	//delete[] 动态;/*只适合于已经指定的纬度数组*/
	printf("\n");

进一步学C++才知道原来动态数组是这样的概念:new 表达式需要指定指针类型以及在方括号中给出的数组维数,该维数可以是任意的复杂表达式。创建数组后,new 将返回指向数组第一个元素的指针。在自由存储区中创建的数组对象是没有名字的,程序员只能通过其地址间接地访问堆中的对象。
显然之前一帖的写法是错误的int *动态 = new int[输入数];,因为int位数最大只能10位,明显当输入一个整数大于10的话则数组长度已经超过了,是没必要的,只要设定合适长度的数组位数就能满足需求,更不用说当输入9位数去当数组维度了.正确的应该修改如下,并在结束后释放内存.

	int 输入数(0), 位(0);
	cout << "输入任意整数不超过指定 Int 范围位数:10位" << endl;
	cin >> 输入数; int *动态 = new int[10];
	do
	{
		动态[位] = 输入数 % 10;
		输入数 /= 10;
		位++;
	} while (输入数 > 0);
	printf("输入数为: %d位\n", 位);
	for (int 序 = 位 - 1; 序 >= 0; 序--)
	printf("%d ", 动态[序]);
	delete[] 动态;
	printf("\n");

	int 数位[10]{0}, 位(0);
	do
	{
		数位[位++] = 输入数 % 10;
	} while (输入数 /= 10);

void 数字位(static int 输入数 = 123456789)/*视操作系统确定位数限制*/
{
	int 数位(0);
	数位 = 输入数 % 10;
	if ((输入数 /= 10))
		数字位(输入数);
	cout << 数位 << " ";
};

	int 输入数, 位 = 0;
	cout << "输入任意整数不超过指定 Int 范围位数:" << endl;
	cin >> 输入数;
	list<int> 动态;
	do/*输出各位数*/
	{
		动态.push_back( 输入数 % 10);
		输入数 /= 10;
		位++;
	} while (输入数 > 0);
	printf("输入数为: %d位\n", 位);
	list<int>::iterator 元素头 = 动态.begin();
	while (元素头 != 动态.end())
		cout << *元素头++ << " ";
	cout << endl;
	list<int>::iterator 元素尾 = 动态.end();
	while (元素尾 != 动态.begin())
		cout << *--元素尾 << " ";
	printf("\n");

以上几种写法是C或C++的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值