14周 — Digital Roots

数字根是一个正整数通过不断将各位数字相加直至得到一位数的过程。例如,24的数字根是6(2+4),39的数字根是3(3+9→12→1+2)。本文介绍如何处理超过2的64次方的输入,使用数组而非长整型来解决这个问题。示例输入包括24、39,输出分别为它们的数字根6和3。

Background

The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the process is repeated. This is continued as long as necessary to obtain a single digit.

For example, consider the positive integer 24. Adding the 2 and the 4 yields a value of 6. Since 6 is a single digit, 6 is the digital root of 24. Now consider the positive integer 39. Adding the 3 and the 9 yields 12. Since 12 is not a single digit, the process must be repeated. Adding the 1 and the 2 yeilds 3, a single digit and also the digital root of 39.

Input

The input file will contain a list of positive integers, one per line. The end of the input will be indicated by an integer value of zero.注意!!该题的输入可能超过2的64次方!!

Output

For each integer in the input, output its digital root on a separate line of the output.

Example

Input

24
39
0
Output
6
3

实际上就是把数拆开加一直加到个位,最开始还是个瓜皮,以为long long int就能表示2的64次方,结果不行,,拿数组就好了,,,,,,还有就是strcmp里的0是双引号,

#include <stdio.h>
#include <string.h>
int f(int x)
{
	int sum=0;
	while(x!=0)
	{
		sum+=x%10;
		x/=10;
	}
	return sum;
}
int main()
{
	char a[100000];
	while(scanf("%s",a) !=EOF)
	{
		if(strcmp(a,"0")==0) break;    
		int cd=strlen(a);
		int jg=0,gc=0;
		for(int i=0;i<cd;i++)
			jg+=a[i]-48;						//把最开始的写成一个整数
		gc=f(jg);
		while(gc>=10)
		{
			gc=f(gc);
		}
		printf("%d\n",gc);
	}
	return 0;
}
### GC Roots 在垃圾回收中的作用和定义 在 Java 虚拟机(JVM)的垃圾回收机制中,GC Roots 是用于判断对象是否为可回收对象的关键起点。通过可达性分析算法(Reachability Analysis),从这些根节点出发,递归遍历所有引用链,未被访问到的对象将被视为不可达,并最终被标记为可回收对象[^1]。 #### 定义 GC Roots 是一组必须活跃的引用,它们作为垃圾回收器进行可达性分析的起始点。这些引用通常包括以下几种类型: - **虚拟机栈中引用的对象**:例如,正在执行的方法中所使用的局部变量或参数。 - **方法区中的类静态属性引用的对象**:如 `static` 修饰的字段。 - **方法区中的常量引用**:如 `final static` 常量。 - **本地方法栈中引用的对象**:例如,通过 JNI(Java Native Interface)创建的对象引用。 - **被同步锁持有的对象**:如被 `synchronized` 关键字引用的对象。 这些对象不会被垃圾回收器回收,因为它们被认为是程序运行过程中必须保持存活的起点[^1]。 #### 作用 GC Roots 的主要作用是帮助 JVM 快速确定哪些对象是“存活”的,从而避免错误地回收仍然被使用中的对象。其核心机制如下: 1. **可达性分析的起点**:JVM 从 GC Roots 开始,逐层向下扫描,构建出所有可达对象的图谱。未被扫描到的对象则被判定为不可达,进而被标记为垃圾。 2. **防止内存泄漏**:通过确保关键对象始终被引用,GC Roots 可以有效防止某些类型的内存泄漏问题,例如缓存未正确释放的情况。 3. **支持复杂的引用结构管理**:现代应用程序中存在大量弱引用(`WeakHashMap`)、软引用(`SoftReference`)等特殊引用类型,GC Roots 提供了统一的起点来处理这些引用的可达性状态[^2]。 #### 示例代码 下面是一个简单的示例,演示如何创建一个强引用,该引用可能成为 GC Roots 的一部分: ```java public class GCRootExample { private static Object rootObject; // 静态字段属于 GC Roots public static void main(String[] args) { Object localObject = new Object(); // 局部变量引用也属于 GC Roots rootObject = localObject; } } ``` 在这个例子中,`localObject` 是一个局部变量,它在 `main` 方法的执行期间属于 GC Roots。而 `rootObject` 是一个静态字段,同样属于 GC Roots,即使 `main` 方法执行完毕后,只要 `rootObject` 仍持有引用,对象就不会被回收。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值